【问题标题】:What is the proper way of creating objects in Java?在 Java 中创建对象的正确方法是什么?
【发布时间】:2015-05-22 13:22:50
【问题描述】:

哪种方法更好? 在类构造函数中创建对象:

public class Menu {
 private JButton start;
 // ...
 public Menu() {
  start = new JButton("Start");
  // ...
 }
}

或在声明变量时创建对象?:

public class Menu{
 private JButton start = new JButton("Start");
 // ...
 public Menu(){
  // ...
 }
}

有什么区别?

【问题讨论】:

  • 请使用适当的缩进,这样更容易阅读

标签: java object constructor


【解决方案1】:

两种变体都可以,但我更喜欢第二种,因为少了一个语句 - 编写,但更重要的是阅读和维护。

AFAIK 在这种情况下没有运行时差异。

有时,当遵循第二个变体时,您甚至可以完全删除自定义构造函数。

【讨论】:

  • 我同意。而且您不必在代码中寻找或搜索声明,您会立即看到它。
  • 第一种情况不会有延迟实例化按钮对象的优势吗?
  • @bot 我不明白你的意思。延迟初始化将是第三种变体。您可以通过将初始化代码代码从构造函数/声明移动到另一个不被构造函数调用(直接或间接)的方法,从而将这两种变体变成惰性变体。
  • @Puce 我的理解是在创建菜单对象之前不会创建按钮对象。如果不是这样,那我就更正了。
  • @bot 这个说法是正确的。但这与您之前的评论有何关系?
【解决方案2】:

已经回答here,问题是针对C#的,但是逻辑还是一样的。

据说遵循这些规则,相当完整:

1.不要使用声明中的默认值(null、false、0、0.0...)进行初始化。

2.如果您没有更改字段值的构造函数参数,则首选在声明中进行初始化。

3.如果字段的值由于构造函数参数而改变,则将初始化放在构造函数中。

4. 在练习中保持一致。 (最重要的规则)

阅读 cmets 了解更多详情。

【讨论】:

    【解决方案3】:

    在构造函数中进行初始化确实可以让您轻松处理异常,这在您的代码库成熟时会有所帮助。

    但是有些人说初始化时的声明更具可读性。但是随后字段在源中出现的顺序变得很重要。

    除了例外考虑,这取决于个人意见。

    【讨论】:

      【解决方案4】:

      第二种方法更好。

      在java中创建对象有四种不同的方式:

      A.使用新关键字 这是在java中创建对象的最常用方法。几乎 99% 的对象都是以这种方式创建的。

      MyObject 对象 = new MyObject();

      B.使用 Class.forName() 如果我们知道类的名称并且如果它有一个公共的默认构造函数,我们可以通过这种方式创建一个对象。

      MyObject 对象 = (MyObject) Class.forName("com.sample.MyObject").newInstance();

      C.使用克隆() clone() 可用于创建现有对象的副本。

      MyObject anotherObject = new MyObject(); MyObject 对象 = anotherObject.clone();

      D.使用对象反序列化 对象反序列化只不过是从其序列化形式创建一个对象。

      ObjectInputStream inStream = new ObjectInputStream(anInputStream); MyObject 对象 = (MyObject) inStream.readObject();

      【讨论】:

      • 问题不在于存在哪些不同的方法,而在于哪种方法是“正确的方法”,以及“有什么区别”。你根本没有回答第二个问题,你一句话就回答了第一个问题,甚至没有解释它,这并没有使你的答案很有用。考虑重新阅读问题并尝试回答所提出的具体问题(并解释您的答案,以便 OP 和未来的读者可以从中学习)
      【解决方案5】:

      没有区别。我通常更喜欢使用第二种方式,但是如果您需要进行异常处理,则需要使用第一种方式。

      【讨论】:

        【解决方案6】:

        使用第一个选项,您可以为对象初始化添加更多逻辑(异常处理、日志记录等)。

        注意:如果您想在某个时候考虑依赖注入,那么声明时的初始化不是一种选择。

        【讨论】:

          【解决方案7】:

          您可以用不同的方式创建对象。正如 Neeraj 已经说过的,Lazy Initialization 有时可能是首选方式。

          在您的示例中,一旦父对象被实例化,您就需要您的按钮,您可以使用两种方式。

          但您也可以考虑以下示例,您可以在需要时准确地创建子对象。

          public class MyObject{
              private List<String> myList = null;
          
              public MyObject(){
                  //do whatever you want
              }
          
              public void add(String toAdd){
                  if(myList == null){
                      myList = new ArrayList<String>();
                  }
                  myList.add(toAdd);
              }
          
          }
          

          【讨论】:

            【解决方案8】:

            你可以双向创建对象,我建议你使用

            JButton start = new JButton("Start");
            

            【讨论】:

              【解决方案9】:

              最好的方法是在类的构造函数中创建和初始化对象。

              【讨论】:

              • 在这种形式下,答案不是很有用,因为你没有解释你的答案,否认 OP 和未来的读者有可能从中学习(顺便说一句,我没有投反对票)
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-08-11
              • 2011-09-20
              • 1970-01-01
              • 2013-10-15
              • 1970-01-01
              • 1970-01-01
              • 2010-10-03
              相关资源
              最近更新 更多