1
public class A
{
    public void doSomething()
    { /*code*/}
}

doSomething方法绝不是引用对象的状态,A因此按照这种逻辑它可能是static

选项1和2有什么区别:

  1. new A().doSomething()
  2. 假设doSomething是静态的;A.doSomething()

我想说选项 2 更好,因为第一个是在每次使用时创建一个新对象。

4

4 回答 4

2

选项 1 创建一个新实例A以调用doSomething()根据您的问题听起来不需要的方法(其中没有任何doSomething()需要 的实例A)。选项 2 在产生相同效果的同时跳过不需要的实例创建,因此会更好(假设这是唯一的设计要求)。现在可能还有其他不使用 static 的原因,例如,如果A在接口中实现,或者如果doSomething在未来某个时候可能需要在其外部建立信息的某个时候,可能会改变其性质。

于 2013-05-03T18:46:23.873 回答
1

您正在进入编程的“表达”部分。你想表达什么?

三个案例正在讨论中:

  1. 你的方法是任何 A 可以采取的行动,或者是任何给定的 A 可以响应的消息,
  2. 您的方法是 A 类应响应的操作,并且
  3. A 是一个单例,您的方法接收该单例的消息。

现在问问自己:你打算表达什么?“doSomething”适合 A 类吗?或者,它只是 A 的每个实例都应该能够做的事情,而不管其内部结构如何?“A”是否代表在您的程序世界中应该只有 1 个实例的东西?

实际上,您不能重载静态方法,因此除了“意图表达”之外,您还需要注意这一点。

许多基本实用程序都属于“静态”类别,并且创建 A 的新实例会花费(少量)时间,但总的来说——你最有可能做对,更重要的是,以后的生活如果您可以正确回答上述问题,那么该方法对其他代码的影响最小,从而选择最接近对象意图的实现。

于 2013-05-03T20:02:35.897 回答
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 的状态,它可以。

于 2013-05-03T18:57:55.913 回答
-1

您必须将该方法声明为静态:

public class A {
    public static void doSomething() {
        // code
    }
}

这使您可以这样做A.doSomething()并且还可以防止doSomething()查看任何实例方法或字段(因为您怎么知道A要使用哪个实例?),如果它不引用它们应该不是问题。

有关详细信息,请参阅Java 教程中有关实例和类方法的文章

于 2013-05-03T18:55:53.367 回答