拥有一个包含所有非静态方法但没有非静态字段的类是否有意义?(或所有静态字段和方法以及构造函数)



我正在查看其他人的代码。

我看到一个没有非静态字段的类,但其中大多数方法都是非静态的,需要您创建一个对象来访问有效静态操作的方法。

这有什么可能的原因,我只是不明白吗?

编辑

有人问了例子。 以下是更多信息。

例如,有一个文件管理器类。 唯一的字段是静态的,并且是比较器。 有一些方法可以执行一些操作,例如对列表中的文件进行排序,对文件进行计数,复制文件,将文件移动到存档文件夹,删除早于特定时间的文件或创建文件(基本上将基本名称作为字符串,并返回具有给定基本名称和日期/时间的文件。9 种非静态方法5 种静态方法我没有看到静态与非静态的押韵原因。

一件特别奇怪的事情是有两种删除文件的方法。 一个是无论如何都会删除文件,另一个是仅在文件为空时才删除文件。 前者是静态方法,而后者不是。 它们包含完全相同的代码,除了后面的第一个检查 file.length 是否为 0。

另一个奇怪的是执行加密的类 - 所有字段和方法都是静态的,但它有一个不执行任何操作的构造函数。 还有一个 init(( 方法,它检查静态变量是否包含自身的对象,如果没有,则将自身的对象实例化到该字段中,然后从未实际使用过。 (这似乎是通过很多类完成的 - init 方法,它们在静态变量中检查自身的对象,如果不实例化自己(

 private static File keyfile;
 private static String KEYFILE = "enc.key";
 private static Scrambler sc; 

它具有加密和解密的方法以及一些处理密钥和文件的方法。

这对任何人都有意义吗? 我只是不明白这些东西的目的吗? 还是看起来很奇怪?

对象不必具有状态。创建仅具有行为的类实例是合法的用例。

为什么要费心创建实例?因此,您可以创建一个并传递它,例如,想象某种形式的计算器,它遵循特定的接口,但每个实例执行的计算方式不同。接口的不同实现会以不同的方式执行计算。

我经常使用非静态方法创建没有成员的类。它允许我封装行为,并且我通常可以在以后添加成员,因为将来实现可能需要(包括与功能无关的东西,例如检测( 我通常不会将这些方法设为静态,因为这限制了我未来的灵活性。

你当然可以这样做。 您应该仔细查看实例方法正在执行的操作。 如果它们都只对传入的参数和静态最终静态类常量进行操作,那完全没问题。

如果是这种情况,则可以使所有这些方法成为静态方法。 这只是一种选择。 我不知道最初的开发人员将如何证明任何一个。 也许你应该问他们。

让我稍微改写一下这个问题,

Even though methods are non-static why would one declare fields as static?

我在下面引用了Java Docs,

Sometimes, you want to have variables that are common to all objects. This is accomplished with the static modifier. Fields that have the static modifier in their declaration are called static fields or class variables. They are associated with the class, rather than with any object. Every instance of the class shares a class variable, which is in one fixed location in memory. Any object can change the value of a class variable, but class variables can also be manipulated without creating an instance of the class.

例如,假设您要创建多个 Bicycle 对象,并为每个对象分配一个序列号,第一个对象从 1 开始。此 ID 号对于每个对象都是唯一的,因此是一个实例变量。同时,您需要一个字段来跟踪已创建的 Bicycle 对象数量,以便您知道要分配给下一个对象的 ID。这样的字段与任何单个对象无关,而是与整个类相关。

有关自行车示例,请参阅 Java 文档。

将所有方法设为非静态方法允许您重写它们。这使得在测试中使用此类变得更加容易,因为您可以使用模拟而不是实际的实现,该模拟的行为符合测试的需要。在我的书中,静态方法是一种代码气味,应该避免使用,除非有充分的理由(例如,非常微不足道的实用方法(。

此外,在未来的某个时候,您可能希望在某些情况下更改方法的行为,例如以策略的形式。

对于加密类,

您可能希望为类提供加密类的实例以处理加密/解密,但能够在其他位置配置详细信息。这将允许您更改算法并更轻松地测试您自己的代码,而无需测试加密。

最新更新