Java中创建对象的正确方法是什么?

3
哪种方法更好?在类构造函数中创建对象:
public class Menu {
 private JButton start;
 // ...
 public Menu() {
  start = new JButton("Start");
  // ...
 }
}

在变量声明时创建对象还是在后续创建对象?
public class Menu{
 private JButton start = new JButton("Start");
 // ...
 public Menu(){
  // ...
 }
}

而且有什么区别呢?

1
请使用适当的缩进,因为它使阅读更容易。 - Ascalonian
9个回答

3

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

据我所知,在这种情况下没有运行时差异。

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


第一种情况不是有惰性实例化按钮对象的优势吗? - Chetan Kinger
1
@bot 我不知道你的意思。懒惰初始化将是第三个变量。您可以通过将初始化代码从构造函数/声明移动到另一个方法中(该方法不会被构造函数直接或间接调用)来将两个变量都转换为延迟加载。 - Puce
据我所知,只有在菜单对象创建后,按钮对象才会被创建。如果不是这样的话,那我就改正我的说法。 - Chetan Kinger
@bot 这个语句是正确的。但它与你之前的评论有什么关系呢? - Puce
@Puce 没错,我应该详细说明我的想法。我的意思是,在需要创建菜单对象之前,按钮对象不会被创建。如果菜单提供一些静态方法,它可能不需要被实例化,从而推迟了按钮实例的创建,直到实际需要创建菜单时才会创建。 - Chetan Kinger
显示剩余5条评论

3

这个问题在这里已经有了解答,虽然是针对C#的问题,但逻辑仍然相同。

建议遵循以下规则,这些规则相当完整:

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

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

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

4. 在实践中保持一致性。(最重要的规则)

请阅读注释以获取更多详细信息。


1
构造函数内的初始化可以轻松处理异常,在代码库不断成熟时非常有帮助。
但是,一些人认为在初始化点处声明更易读。但是,源代码中字段出现的顺序变得更加重要。
除了异常方面的考虑外,这取决于个人意见。

1
第二种方法更好。
在Java中有四种不同的创建对象的方式:
A. 使用new关键字 这是在Java中创建对象最常见的方式。几乎99%的对象都是用这种方式创建的。
MyObject object = new MyObject();
B. 使用Class.forName() 如果我们知道类的名称,并且它具有公共默认构造函数,我们可以使用这种方式创建对象。
MyObject object = (MyObject) Class.forName("com.sample.MyObject").newInstance();
C. 使用clone() clone()可以用来创建现有对象的副本。
MyObject anotherObject = new MyObject(); MyObject object = anotherObject.clone();
D. 使用对象反序列化 对象反序列化就是从其序列化形式创建对象。
ObjectInputStream inStream = new ObjectInputStream(anInputStream); MyObject object = (MyObject) inStream.readObject();

这个问题不是关于有哪些不同的方法,而是关于哪种方法是“正确的方式”,以及“有什么区别”。你根本没有回答第二个问题,而且你只用一句话回答了第一个问题,甚至没有解释清楚,这使得你的回答并不是很有用。请考虑重新阅读问题,并尝试回答被问到的具体问题(并解释你的答案,这样OP和未来的读者可以从中学习)。 - LionC

0

您可以以不同的方式创建对象。正如Neeraj所说,延迟初始化有时可能是首选的方法。

在您的示例中,当您需要按钮与父对象一起实例化时,您可以使用两种方式。

但是您也可以考虑以下示例,在此示例中,您可以在需要子对象的确切时间创建它。

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);
    }

}

0

没有区别。我通常更喜欢使用第二种方式,但如果你需要异常处理,那么你需要使用第一种方式。


0

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

注意:如果您想在某个时间考虑依赖注入,那么在声明时进行初始化不是一个选项。


-1

你可以用两种方式创建对象,我建议你使用

JButton start = new JButton("Start");

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

在这种形式下,答案并不是很有用,因为您没有解释您的答案,否则会拒绝OP和未来读者从中学习的可能性(顺便说一句,我没有投票反对)。 - LionC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接