public class A
{
public void doSomething()
{ /*code*/}
}
doSomething
方法没有引用对象A
的状态,因此根据逻辑,它可能是static
。
选项1和选项2的区别是什么?
-
new A().doSomething()
- 假设
doSomething
为静态;A.doSomething()
我想说选项2更好,因为第一个选项每次使用时都会创建一个新对象。
选项1创建A
的新实例,以便调用方法doSomething()
,根据您的问题,这听起来像是不需要(doSomething()
中没有任何东西需要A
的实例)。选项2在产生相同效果的同时跳过不必要的实例创建,因此它会更好(假设这是唯一的设计要求)。现在可能有其他原因不使用静态,例如,如果A
在接口中实现,或者如果doSomething
的性质可能在将来的某个时候发生变化,可能需要在它之外建立的信息。
您正在进入编程的"表达式"部分。你想表达什么?
正在讨论三种情况:
- 你的方法是任何A都可以采取的动作,或者是任何给定A都可以响应的消息,
- 你的方法是A类应该响应的动作,
- A是一个单例,你的方法接收该单例的消息。
现在问你自己:你想表达什么?"做点什么"适合A类吗?或者,它只是A的每个实例都应该能够做的事情,而不管它的内部是什么?A是否代表了,在你的程序中,应该只有一个实例的东西?
作为一个实际的点,你不能重载静态方法,所以除了"意图的表达",你需要意识到这一点。
许多基本实用程序都属于"静态"类别,创建A的新实例会有(很小的)时间损失,但总的来说——你最有可能把它做对,更重要的是,如果你能正确回答上面的问题,那么该方法的后期寿命将对其他代码的影响最小,从而选择最符合对象意图的实现。
还有第三种选择。
创建A的一个实例,然后为每个调用重用它。
。,在使用A的类或应用程序中,
A myA = new A(); // you can consider making this static if that makes sense...
…然后,在需要的时候…
myA.soSomething();
这样做的好处是,将来如果你确实需要改变doSomething的行为,你可以把第一行改成
A myA = new SubclassOfAThatDoesSomethingDifferent();
或者,如果doSomething()
最终确实需要引用A的状态,它可以。
您必须将该方法声明为静态:
public class A {
public static void doSomething() {
// code
}
}
这允许您执行A.doSomething()
,并且还可以防止doSomething()
查看任何实例方法或字段(因为您如何知道使用哪个A
实例?),如果它不引用它们,这应该不是问题。
请参阅Java教程的实例和类方法文章了解详细信息。