静态VS新对象
public class A
{
public void doSomething()
{ /*code*/}
}
的doSomething
方法不以任何方式,从而由逻辑它可能是static
引用对象A
的状态。静态VS新对象
是什么选项1和2之间的差:
new A().doSomething()
- 假设
doSomething
是静态的;A.doSomething()
我想说的是,选项2更好,因为每当它使用时第一个将创建一个新的对象。
选项1,以调用哪个根据你的问题听起来好像它并不需要(没有什么doSomething()
需要的A
一个实例)的方法doSomething()
创建的A
一个新的实例。选项2跳过不需要的实例创建,同时产生相同的效果,所以它会更好(假设这是唯一的设计要求)。现在可能有其他原因不使用静态,例如,如果在界面中实现了A
,或者如果在将来可能需要在其之外建立信息的某个点处可以改变doSomething
的性质。
你必须声明为静态的方法:
public class A {
public static void doSomething() {
// code
}
}
这允许你做A.doSomething()
并防止doSomething()
从看任何实例方法或字段(因为你怎么会知道这A
实例使用?),如果它没有引用它们,这应该不成问题。
有关详细信息,请参阅The Java Tutorial's Article on Instance and Class Methods。
还有第三个选项。
创建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的状态,则可以。
我希望这是一个选项。我排除这一点的原因是因为有几个不同的文件/类引用了相同的方法。 – Sababado 2013-05-03 19:05:00
您正在进入编程的“表达式”部分。你想表达什么?
三种情况讨论:
- 你的方法是一个行动的任何一个可以采取,或消息的任何给定的一个可以回应,
- 你的方法是一个动作A类的应该回应到,并且
- A是一个单身人士,您的方法接收该单身人士的消息。
现在问自己:你打算表达什么?对于A类,“doSomething”是否合适?或者说,它只是A的每个实例都应该能够做到的事情,而不管它的内部是什么? “A”是否表示在您的程序世界中应该只有1个实例?
作为一个实践点,你不能重载静态方法,所以除了“表达意图”之外,你需要意识到这一点。
很多基本工具都属于“静态”类别,创建A的新实例时会有(小)时间损失,但总体而言 - 您最有可能做到最好,更重要的是如果你能够正确地回答上述问题,那么该方法的后期生活将对其他代码的影响最小,从而选择最符合该对象意图的实现。
'new A()'创建一个新对象;调用静态方法不需要调用实例。通常,对象创建*非常便宜,我推荐*接口*和*避免静态方法*。在使用DI和/或IoC之前,为什么不一定会变得明显,并且在哪个时间您可能只是感谢这些建议。 – user2246674 2013-05-03 18:43:19
也许它不应该在'A'类。 – 2013-05-03 18:43:26
A.doSomething()将无法访问A的实例变量,它们需要作为参数传入 – 2013-05-03 18:46:21