public class A
{
public void doSomething()
{ /*code*/}
}
doSomething
方法绝不会引用对象A
的状态,因此该逻辑可能是static
。
选项1和2之间有什么区别:
new A().doSomething()
doSomething
是静态的; A.doSomething()
我想说选项2更好,因为第一个选项会在每次使用时创建一个新对象。
答案 0 :(得分:1)
选项1创建A
的新实例,以便调用方法doSomething()
根据您的问题听起来它不需要(doSomething()
中没有任何内容这需要A
的实例。选项2跳过不需要的实例创建,同时产生相同的效果,因此它会更好(假设这是唯一的设计要求)。现在可能有其他原因不使用静态,例如,如果在接口中实现A
,或者doSomething
的性质可能会在未来某些时候发生变化,可能需要在外部建立信息它的。
答案 1 :(得分:1)
你正在进入编程的“表达”部分。你想表达什么?
正在讨论三个案例:
现在问问自己:你打算表达什么? “doSomething”适合A级吗?或者,它是否恰好是A的每个实例应该能够做到的事情,无论其内部结构如何? “A”代表的是在您的程序世界中应该只有1个实例吗?
实际上,你不能重载静态方法,所以除了“表达意图”之外,你需要注意这一点。
许多基本实用程序属于“静态”类别,并且创建A的新实例会有(小)时间损失,但总体而言 - 您最有可能做到正确,更重要的是,如果你能正确回答上面的问题,那么该方法的后期生命对其他代码的影响最小,从而选择最接近对象意图的实现。
答案 2 :(得分:0)
还有第三种选择。
创建一个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的状态,它可以。
答案 3 :(得分:-1)
您必须将该方法声明为静态:
public class A {
public static void doSomething() {
// code
}
}
这允许您执行A.doSomething()
并阻止doSomething()
查看任何实例方法或字段(因为您如何知道要使用哪个A
实例?),这应该是'如果它不引用它们就成了问题。
有关详细信息,请参阅The Java Tutorial's Article on Instance and Class Methods。