静态与新对象

时间:2013-05-03 18:41:59

标签: java oop static new-operator

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

doSomething方法绝不会引用对象A的状态,因此该逻辑可能是static

选项1和2之间有什么区别:

  1. new A().doSomething()
  2. 假设doSomething是静态的; A.doSomething()
  3. 我想说选项2更好,因为第一个选项会在每次使用时创建一个新对象。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

正在讨论三个案例:

  1. 您的方法是任何A可以采取的行动,或任何给定A可以响应的消息,
  2. 您的方法是A类应该响应的动作,
  3. A是单身人士,您的方法会收到该单身人士的消息。
  4. 现在问问自己:你打算表达什么? “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