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

时间:2013-08-15 13:22:54

标签: java static

我在看别人的代码。

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

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

修改

有人问了一些例子。这是一些更多的信息。

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

一个特别奇怪的事情是有两种删除文件的方法。一个删除文件,无论什么,一个只删除它,如果它是空的。前者是静态方法,后者则不是。它们包含完全相同的代码,但后面的第一次检查是否为file.length为0。

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

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

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

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

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

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

如果是这种情况,可能使所有这些方法都是静态的。那只是一个选择。我不知道原始开发者如何证明这两者之一。也许你应该问他们。

答案 2 :(得分:1)

使所有方法都是非静态的,允许您覆盖它们。这使得在测试中使用此类变得更加容易,因为您可以使用模拟行为,而不是实际的实现。在我的书中,静态方法是代码气味,应该避免,除非有充分的理由(例如非常简单的实用方法)。

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

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

答案 3 :(得分: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 Docs