初始化对象的最佳方法是什么

时间:2013-06-07 15:18:02

标签: java object initialization

我有一个关于对象初始化的基本问题。 更新SomeClass只是其他类。 Foo类只使用someClass的方法。例如:使用DAO对象(SomeClass)方法的Controller(Foo)。

最好的方法是什么?

1方法 - 使用构造函数

 public class Foo{

      private SomeClass someClass;

      public Foo()
      {
         someClass=new SomeClass();
      }
      public void method1(){//uses someClass}
      public void method2(){//uses someClass}
  }

2方法 - 每种方法的初始化

      public class Foo{

       public void method1(){SomeClass someClass = new SomeClass();}
       public void method2(){SomeClass someClass = new SomeClass();}
  }

3方法 - 没有构造函数的初始化

       public class Foo{

        private SomeClass someClass=new SomeClass();

        public void method1(){//uses someClass}
        public void method2(){//uses someClass}
 }

2 个答案:

答案 0 :(得分:2)

你问题的答案实际上取决于SomeClass的工作方式,以及你希望它做什么。

方法1:在构造函数中创建对象实例。

  • 优点:您可以在不同的构造函数中创建不同的实例。您可以在Foo的所有方法中使用相同的实例。
  • 缺点:您可能不希望在Foo的所有方法中使用相同的实例。

方法2:在方法中创建对象实例。

  • 优点:您可以在一种方法中使用许多不同的SomeClass实例。
  • 缺点:您必须多次实例化SomeClass。这可能很昂贵,具体取决于SomeClass的功能。

方法3:在属性声明中创建对象实例。

  • 优点:尽管调用了哪个构造函数,但在Foo的所有方法中都获得相同的实例(除非您覆盖该值)。

  • 缺点:如果方法更改了SomeClass的状态,如果您在设计中没有考虑到这一点,则可能会导致问题。

方法4:依赖注入。将SomeClass的实例注入到Foo的构造函数中。

  • 优点:您可以指定在运行时使用的SomeClass实例。
  • 缺点:调用代码需要提供一个实例,根据您要完成的操作,这可能是不必要的。

    private mySomeClass;
    
    public Foo(SomeClass mySomeClass)
    {
        this.mySomeClass = mySomeClass;
    }
    
    public void method1(){
        if(mySomeClass != null)  mySomeClass.runSomething();
    }
    

答案 1 :(得分:0)

这取决于你想用初始化对象做什么:

  • 对于原型,在方法
  • 中初始化
  • 对于一对一的关系,请进行合成
  • 对于多对一创建单个对象(隐藏SomeClass的构造函数 - 使其成为私有)并使用类似SomeClass.getSingleton() <的方法获取所有相关类的对象/ LI>

请注意,上述每种情况都会在多线程期间产生影响