在Java中,除了在构造函数中实例化实例变量之外,还有什么不好的编程习惯吗?
我正在制作一个GUI,我正在考虑在构造函数中编写GUI构建,以便在我的主要内容中,我可以创建一个新的类实例来启动GUI。
答案 0 :(得分:2)
这正是构造函数的用途。构造函数的目的是初始化事物,以便实例现在存在于它期望的程序中。
例如,如果您创建一个Window
类,则实例可能还会有一个Content
实例,依此类推。但是,此过程不仅限于您对使用实例变量的引用。
答案 1 :(得分:2)
将内容打包成小型/简洁易懂的单元通常是个好主意。
构造函数是初始化发生的地方。如果您担心在那里编写太多代码,可以将UI初始化代码打包到方法中(例如,将其称为initUI())并在构造函数的末尾调用它
答案 2 :(得分:1)
构造函数旨在初始化您的对象。现在,如果初始化对象需要初始化实例变量和/或调用某些方法或者在其中有一些逻辑,那就没问题了。
我喜欢的一种做法是不要使构造函数膨胀。相反,在单独的方法中将逻辑块中的初始化代码分开,并从构造函数内部调用它们。就像你的情况一样,
public class MyClass{
public MyClass(){
this.myVar1 = new myVar();
...
buildUI(param1, param2,...);
}
//can make it public if you think this method can call to repaint or something
private void buildUI(Param1 param1, Param2 param2,...){
....
}
}
答案 3 :(得分:1)
不要忘记Builder Pattern。此模式旨在允许您“构建”对象。
在Java中,通常的做法是覆盖诸如JPanel之类的类,并在构造函数内部添加构建逻辑,在这种情况下,类是自建。也可以创建自己的类,只返回完全构造的JPanel,这是我的偏好。例如:
public class MyJPanelBuilder {
public JPanel build() {
JPanel panel = new JPanel();
// Add all your components to the panel, lay it out how you want etc.
// You can do it this way because all of the methods required are public!
return panel;
}
}
我更喜欢这种方法,因为如果你只是使用JVM提供的小部件,就会更难违反MVC。
答案 4 :(得分:0)
与RAY类似,我建议保持组件小而且集中。 为了使Nishant和Markus的语句更精确,构造函数应该保留对象的初始化,但实际上你可以选择如何做到这一点。
我通常直接(通过new运算符)或间接(通过私有方法调用)反对在构造函数中实现协作对象,因为这会使测试变得更难。有时你想用一个合作者替换一个假的,找到一个bug的来源。如果您使用新操作符或私有方法,则不会轻易实现。
因此,我倾向于通过参数将依赖项传递给我的构造函数来自某个外部位置(工厂或构建器,由Bringer128提及)。您的构造函数希望参数已经初始化,因此在将它们分配给对象的字段后,该对象就可以使用了。
当然,在依赖的情况下,你永远不需要替换它更容易,而且可以安全地直接在构造函数中实例化它们。特别是在GUI中,会有很多这样的情况(标签等)。但是,如果您从GUI层外部(如业务对象)有依赖关系,我肯定不会在构造函数中创建它。