0

我有一个关于对象初始化的基本问题。更新 SomeClass 只是其他类。Class Foo 只是使用 someClass 的方法。例如:使用 DAO 对象(SomeClass)的方法的控制器(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}
 }
4

2 回答 2

2

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

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

  • 优点:可以在不同的构造函数中创建不同的实例。您可以在 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();
    }
    
于 2013-06-07T15:37:14.983 回答
0

这将取决于您要对初始化对象执行的操作:

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

请注意,上述每种情况在多线程期间都有其自身的后果

于 2013-06-07T15:29:22.303 回答