Java 类与本地实例化

Java 类与本地实例化,java,class,instantiation,Java,Class,Instantiation,当第一个实例化不是强制性的(通常是在我可以完成它们的时候)时,类实例化和本地实例化是否有区别?有没有我应该遵循的“规则” 我养成了总是使用类实例化来实例化其他类的习惯,我真的不知道这是不是不好 public class aService { private final SomeClass someClass = new SomeClass(); public void someMethod() { someClass.doSomething(); } }

当第一个实例化不是强制性的(通常是在我可以完成它们的时候)时,类实例化和本地实例化是否有区别?有没有我应该遵循的“规则”

我养成了总是使用类实例化来实例化其他类的习惯,我真的不知道这是不是不好

public class aService {
    private final SomeClass someClass = new SomeClass();

    public void someMethod() {
        someClass.doSomething();
    }
}

// or

public class aService {
    public void someMethod() {
        SomeClass someClass = new SomeClass();
        someThing.doSomething();
    }
}

我更喜欢在给定的方法中初始化
someClass
,如果它只在该方法中使用

如果要跨所有方法(多个)使用
someClass
,并存储对象状态,请选择解决方案1


当需要优化时,第一种方法更好,因为
someClass
只创建一次。另一方面,您可能永远不会调用
someMethod()
。在这种情况下,您会浪费内存。特别是如果你有很多这样的对象

如果你描述的情况是一个一次性使用的方法,它被实例化一次以达到特定的目的,之后它的实例就不需要再存在了,那么我更喜欢这些选项中的。两者都不必要地创建了一个实例

相反,我更愿意专注于在
SomeClass
静态中创建我所关心的方法。主要原因是我可以保存一个不必要的对象实例化,并使API及其使用更加顺畅。

本身没有“规则”,但由于它与开发相关,因此规则与良好的干净开发人员代码指南相关。。。 calss字段/变量应在构造函数中初始化。。。这是建造师的工作


由于显而易见的原因,常量可以在同一行中声明和init…

这取决于someClass是什么和做什么。它是否有任何状态,或者是不可变的?它并不完全相同,但如果没有区别,那么第一个版本更好,因为每个对象只需创建一次对象,而不是每个方法调用一次。这两者之间的显著区别在于,在第一个示例中,您可以在所有范围内访问名为
someClass
的变量,而在第二个示例中,
someClass
someMethod
完成执行后立即消失。您是在问关于该变量生命周期的问题吗?someClass是不可变的。@Makoto如果我们说someClass不是由多个方法使用的,而是只使用一次,并且不需要限定范围,我应该更喜欢局部实例化吗?这是一种有趣的方式。静态可能是我一直在寻找的,而且可能更难进行单元测试。我认为只有当有很好的理由这样做时才应该使用static。@GhostCat那么你会怎么做?我说:A)尽可能避免使用static B)对于你的问题:你只把这些东西作为类的一个字段,而这个字段需要不止一个方法。@GhostCat:static的一个完全合法的用法是引用的类不是隐式必需的。它将单元测试从关注返回级别的方法结果转移到基于其副作用的方法结果上,这并不会使测试变得更加困难。如果您不需要类的实例,那么
static
是更理想的解决方案。