繁体   English   中英

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

[英]Is it good programming practice? Constructors and instance variables

在Java中,除了实例化构造函数中的实例变量以外,做任何其他事情都是不好的编程习惯吗?

我现在正在制作一个GUI,并且我正在考虑对构造函数内部的GUI构建进行编码,以便在我的主体中,我可以创建该类的新实例来启动GUI。

这正是构造函数的用途。 构造函数的目的是初始化事物,以便该实例现在存在于它预期所在的程序中。

例如,如果您创建一个Window类,则一个实例可能还希望有一个Content实例,依此类推。 但是,此过程不限于您拥有使用实例变量的引用。

通常,将事物包装成小型/简洁且易于理解的单元是一个好主意。

构造函数是初始化的地方。 如果您担心在其中编写太多代码,可以将UI初始化代码打包到一个方法中(例如,将其称为initUI()),然后在构造函数的末尾调用它

构造函数旨在初始化您的对象。 现在,如果初始化您的对象,则需要初始化实例变量和/或调用某些方法或其中包含某些逻辑,这没关系-这没错。

我喜欢的一种做法是不要夸大构造函数。 取而代之的是,将初始化代码分成逻辑块,放在单独的方法中,然后从构造函数内部调用它们。 就像你的情况一样

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,...){ 
     ....
   }
} 

不要忘记生成器模式 此模式旨在允许您“构建”对象。

在Java中,通常的做法是重写诸如JPanel之类的类,并在构造函数内部添加构建逻辑,在这种情况下,该类是self-building 也可以创建自己的类,该类仅返回完全构造的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。

与RAY相似,我建议保持组件的小巧和集中。 为了使Nishant和Markus的语句更加精确,构造函数应该使该对象保持初始化状态,但是实际上您可以选择执行此操作的方式。

我通常反对直接(通过new运算符)或间接(通过私有方法调用) 从构造函数中实例化协作对象 ,因为这会使测试更加困难。 有时,您想用协作者代替假冒者来查找错误的来源。 如果您使用新的运算符或私有方法,那么您将很难做到这一点。

因此,我倾向于将依赖项从某个外部位置(Bringer128提到的工厂或构建器) 通过其参数传递给构造函数 您的构造函数希望参数已被初始化,因此在将它们分配给对象的字段之后,就可以使用该对象了。

当然,在依赖关系的情况下,您将不需要替代它,就可以更轻松,更安全地直接在构造函数中实例化它们。 特别是在GUI中,会有很多情况(标签等)。 但是,如果您从GUI层(例如业务对象)外部获得依赖关系,则一定不要在构造函数中创建它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM