使用实用程序 类 存储对象是一种好习惯吗?

Is it good practice to store objects using utility classes?

这主要是一个编码风格问题。我想知道从实用程序 classes 中存储和获取对象是否是一个好的编码原则?

例如,假设我创建了一个整数列表,我希望其他 classes 使用该列表。但是,为了做到这一点,每次我想要 use/edit 列表时,我都必须在每个 class 中传递列表。 与其这样做,不如创建一个实用程序 class,每次我想使用它时都为我 'gets' 这个列表?

使用实用程序 class 清理我的代码。但是,我听说即使使用实用程序 class 也被认为是一种不好的做法。谢谢!

public class ThisExample {

    private static final List<Integer> thisList = new ArrayList<Integer>();

    public static List<Integer> getMoveHistory() {
        return thisList;
    }
}

我建议从优缺点而不是最佳实践的角度来看待你的问题,因为后者是一个见仁见智的问题。

使用全局容器的优点:

  • 易于访问全局变量 - 每个将导入容器的 class 都将能够访问全局数据。
  • 共享变量的集中化——寻找一个特定的全局变量很容易,假设所有变量都存储在同一个容器中class。
  • 文档 - 将所有全局变量存储在一个 class 中有助于记录全局变量的上下文和用途 - 只需按上下文对它们进行分组并添加注释以解释它们在应用程序中的作用。
  • 简单 - 对于较小的代码 bases/applications,使用单线程方法和少量 classes 和代码流,使用全局变量的容器可以是一个简单直接的解决方案用于在实体之间传递信息。

使用全局容器的缺点:

  • Class 耦合 - 所有将使用全局变量的 classes 都必须导入相同的 Container class,这将导致对许多其他 classes 的容器 class。对容器 class 的更改现在将同时影响许多其他 classes。

  • 单点故障 - 许多应用程序代码流将通过抛出容器 class。这使得某些方法(例如使用同步锁)在容器 class 上不切实际,出于性能方面的考虑。

  • 调试困难 - 由于应用程序的许多元素将不可避免地访问全局变量,因此调试它们的内容会更加困难,尤其是在多线程解决方案中。

  • 面向对象的反模式——如果说OO方法专注于代码的封装和解决方案的抽象,那么全局容器恰恰相反——共享代码,纯粹专注于实现(例如,当使用 DS 全局变量时)。

  • 始终在内存中 - 只要应用程序运行,全局容器的变量就会在范围内。许多内存泄漏是遗忘的范围内变量的结果。

参考文献: