2015-03-19 155 views
3

哪种方法更好?在类的构造函数 创建对象:在Java中创建对象的正确方法是什么?

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 2015-03-19 12:22:39

回答

3

这两种变体都可以,但我更喜欢第二种,因为有一种语句较少写入,但更重要的是要读取和维护。

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

有时候,在跟随第二个变体时,甚至可以完全删除自定义构造函数。

+0

我同意。而且您不必在代码中搜索或搜索声明,就可以立即看到它。 – Ascalonian 2015-03-19 12:23:39

+0

第一种情况不会有懒惰地实例化按钮对象的优点吗? – CKing 2015-03-19 12:28:00

+1

@bot我不知道你的意思。懒惰初始化将是第三个变体。通过将构造函数/声明中的初始化代码移动到另一个方法中,而不是由构造函数调用(直接或间接),可以将这两个变体转换为惰性方法。 – Puce 2015-03-19 12:34:41

1

构造函数中的初始化确实允许您轻松处理异常,这可以在您的代码库成熟时提供帮助。

但是一些民间人士说,初始化时声明更具可读性。但是,订单该字段中出现的字段变得重要。

除了例外的考虑,这是个人意见。

0

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

0

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

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

3

已经回答了here,问题在于C#,但逻辑仍然是一样的。

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

不要在声明中使用默认值初始化(空,假,0,0.0 ...)。

2.如果您没有可以更改字段值的构造函数参数,则首选初始化。

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

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

阅读评论了解更多详情。

0

您可以用不同的方式创建对象。正如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); 
    } 

} 
-3

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

+0

在这种形式下,答案不是很有用,因为你没有解释你的答案,否认OP和将来的读者从中学习的可能性(我没有downvote顺便说一句) – LionC 2015-03-19 12:55:29

1

第二种方法更好。

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

A.使用new关键字 这是建立在Java对象最常见的方式。几乎99%的对象都是以这种方式创建的。

MyObject object = new MyObject();

B.使用Class.forName() 如果我们知道类&的名称,如果它具有公共的默认构造函数,我们可以用这种方式创建一个对象。 (MyObject)Class.forName(“com.sample.MyObject”)。newInstance();方法使用克隆() clone()可用于创建现有对象的副本。

MyObject anotherObject = new MyObject(); MyObject object = anotherObject.clone();

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

ObjectInputStream inStream = new ObjectInputStream(anInputStream); MyObject object =(MyObject)inStream.readObject();

+0

问题不是关于哪些不同的方法存在,但关于哪一个是“正确的方式”和“有什么区别”。你根本没有回答第二个问题,你用一句话回答了第一个问题,甚至没有解释它,这并没有使你的答案非常有用。考虑重新阅读这个问题并试图回答被问到的具体问题(并解释您的答案,以便OP和未来的读者可以从中学习) – LionC 2015-03-19 12:57:32

-1

您可以对象了解创建两路,我推荐你使用

JButton start = new JButton("Start"); 
相关问题