0

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

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

有没有可能的原因,我只是不理解?

编辑

有人问例子。这是更多信息。

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

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

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

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

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

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

4

4 回答 4

4

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

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

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

于 2013-08-15T13:33:23.313 回答
2

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

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

于 2013-08-15T13:29:03.370 回答
1

将所有方法设为非静态允许您覆盖它们。这使得在测试中使用这个类变得更加容易,因为除了实际的实现之外,您还可以使用一个在测试中表现得如您所愿的模拟。在我的书中,静态方法是一种代码味道,应该避免使用,除非有充分的理由(例如非常微不足道的实用方法)。

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

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

于 2013-08-15T13:26:54.170 回答
1

让我重新表述一下这个问题,

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 文档

于 2013-08-15T13:37:04.033 回答