这是很好的编程习惯吗?构造函数和实例变量

时间:2011-01-06 05:58:43

标签: java user-interface

在Java中,除了在构造函数中实例化实例变量之外,还有什么不好的编程习惯吗?

我正在制作一个GUI,我正在考虑在构造函数中编写GUI构建,以便在我的主要内容中,我可以创建一个新的类实例来启动GUI。

5 个答案:

答案 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层外部(如业务对象)有依赖关系,我肯定不会在构造函数中创建它。

相关问题