public class A
{
public void doSomething()
{ /*code*/}
}
该doSomething
方法绝不是引用对象的状态,A
因此按照这种逻辑它可能是static
。
选项1和2有什么区别:
new A().doSomething()
- 假设
doSomething
是静态的;A.doSomething()
我想说选项 2 更好,因为第一个是在每次使用时创建一个新对象。
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 在产生相同效果的同时跳过不需要的实例创建,因此会更好(假设这是唯一的设计要求)。现在可能还有其他不使用 static 的原因,例如,如果A
在接口中实现,或者如果doSomething
在未来某个时候可能需要在其外部建立信息的某个时候,可能会改变其性质。
您正在进入编程的“表达”部分。你想表达什么?
三个案例正在讨论中:
现在问问自己:你打算表达什么?“doSomething”适合 A 类吗?或者,它只是 A 的每个实例都应该能够做的事情,而不管其内部结构如何?“A”是否代表在您的程序世界中应该只有 1 个实例的东西?
实际上,您不能重载静态方法,因此除了“意图表达”之外,您还需要注意这一点。
许多基本实用程序都属于“静态”类别,并且创建 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 教程中有关实例和类方法的文章。