静态vs新对象


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

doSomething方法没有引用对象A的状态,因此根据逻辑,它可能是static

选项1和选项2的区别是什么?

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

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

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

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

正在讨论三种情况:

  1. 你的方法是任何A都可以采取的动作,或者是任何给定A都可以响应的消息,
  2. 你的方法是A类应该响应的动作,
  3. 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教程的实例和类方法文章了解详细信息。

最新更新