2013-05-03 70 views
0
public class A 
{ 
    public void doSomething() 
    { /*code*/} 
} 

doSomething方法不以任何方式,从而由逻辑它可能是static引用对象A的状态。静态VS新对象

是什么选项1和2之间的差:

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

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

+5

'new A()'创建一个新对象;调用静态方法不需要调用实例。通常,对象创建*非常便宜,我推荐*接口*和*避免静态方法*。在使用DI和/或IoC之前,为什么不一定会变得明显,并且在哪个时间您可能只是感谢这些建议。 – user2246674 2013-05-03 18:43:19

+1

也许它不应该在'A'类。 – 2013-05-03 18:43:26

+0

A.doSomething()将无法访问A的实例变量,它们需要作为参数传入 – 2013-05-03 18:46:21

回答

1

选项1,以调用哪个根据你的问题听起来好像它并不需要(没有什么doSomething()需要的A一个实例)的方法doSomething()创建的A一个新的实例。选项2跳过不需要的实例创建,同时产生相同的效果,所以它会更好(假设这是唯一的设计要求)。现在可能有其他原因不使用静态,例如,如果在界面中实现了A,或者如果在将来可能需要在其之外建立信息的某个点处可以改变doSomething的性质。

-1

你必须声明为静态的方法:

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

这允许你做A.doSomething()并防止doSomething()从看任何实例方法或字段(因为你怎么会知道这A实例使用?),如果它没有引用它们,这应该不成问题。

有关详细信息,请参阅The Java Tutorial's Article on Instance and Class Methods

+0

我很欣赏这个回答,但这不是问题的问题。我知道如何声明一个静态方法,以及如何在代码中引用它与创建对象,我的问题更多的是两个 – Sababado 2013-05-03 19:02:56

+1

@Sababado之间的幕后差异哦。在这种情况下,我建议使用静态方法,因为如果它刚刚立即得到GCed,没有理由创建对象。查看其他答案的更多详情 – 2013-05-03 19:09:08

+0

谢谢,非常感谢 – Sababado 2013-05-03 19:16:44

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的状态,则可以。

+0

我希望这是一个选项。我排除这一点的原因是因为有几个不同的文件/类引用了相同的方法。 – Sababado 2013-05-03 19:05:00

1

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

三种情况讨论:

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

现在问自己:你打算表达什么?对于A类,“doSomething”是否合适?或者说,它只是A的每个实例都应该能够做到的事情,而不管它的内部是什么? “A”是否表示在您的程序世界中应该只有1个实例?

作为一个实践点,你不能重载静态方法,所以除了“表达意图”之外,你需要意识到这一点。

很多基本工具都属于“静态”类别,创建A的新实例时会有(小)时间损失,但总体而言 - 您最有可能做到最好,更重要的是如果你能够正确地回答上述问题,那么该方法的后期生活将对其他代码的影响最小,从而选择最符合该对象意图的实现。