哪种方法更好? 在类构造函数中创建对象:
public class Menu{
private JButton start;
// ...
public Menu(){
start = new JButton("Start");
// ...
}
}
或在变量声明时创建对象?:
public class Menu{
private JButton start = new JButton("Start");
// ...
public Menu(){
// ...
}
}
有什么区别?
答案 0 :(得分:3)
两种变体都可以,但我更喜欢第二种变体,因为只有少量语句 - 写入,但更重要的是阅读和维护。
在这种情况下,AFAIK没有运行时差异。
有时,在遵循第二个变体时,您甚至可以完全删除自定义构造函数。
答案 1 :(得分:3)
已经回答here,问题出在C#上,但逻辑仍然是一样的。
据说这些规则非常完整:
1。不要使用声明中的默认值进行初始化(null,false,0,0.0 ...)。
2. 如果您没有更改字段值的构造函数参数,则首选声明初始化。
3. 如果字段的值因构造函数参数而更改,则将初始化放在构造函数中。
4. 在练习中保持一致。 (最重要的规则)
阅读评论以获取更多详细信息。
答案 2 :(得分:1)
构造函数中的初始化确实允许您轻松处理异常,这可以在您的代码库成熟时提供帮助。
但是有些人说初始化时的声明更具可读性。但是那些字段出现在源中的 order 变得很重要。
除了例外情况外,还有个人意见。
答案 3 :(得分:1)
第二种方法更好。
在java中创建对象有四种不同的方法:
一个。使用新关键字 这是在java中创建对象的最常用方法。几乎99%的对象都是以这种方式创建的。
MyObject object = new MyObject();
B中。使用Class.forName() 如果我们知道班级的名称&如果它有一个公共默认构造函数,我们可以用这种方式创建一个对象。
MyObject object =(MyObject)Class.forName(" com.sample.MyObject")。newInstance();
℃。使用clone() clone()可用于创建现有对象的副本。
MyObject anotherObject = new MyObject(); MyObject对象= anotherObject.clone();
d。使用对象反序列化 对象反序列化只不过是从序列化形式创建对象。
ObjectInputStream inStream = new ObjectInputStream(anInputStream); MyObject object =(MyObject)inStream.readObject();
答案 4 :(得分:0)
没有区别。我通常更喜欢使用第二种方式,但是如果你需要进行异常处理,那么你需要使用第一种方式。
答案 5 :(得分:0)
使用第一个选项,您可以为对象初始化添加更多逻辑(异常处理,日志记录等)。
注意:如果您想在某些时候考虑依赖注入,那么声明初始化不是一种选择。
答案 6 :(得分: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);
}
}
答案 7 :(得分:-1)
您可以双向创建对象,我建议您使用
JButton start = new JButton("Start");
答案 8 :(得分:-3)
最好的方法是在类的构造函数中创建和初始化对象。