【问题标题】:Constructor initialization of instance variables实例变量的构造函数初始化
【发布时间】:2015-04-28 09:33:11
【问题描述】:

如果我有类似下面的代码作为构造函数,如果所有实例变量的名称与参数名称相同,是否有一种简单的速记方法可以在一行中执行所有实例变量初始化?

private Quiz(int id, String name, int creatorId, Date timeCreated,
        int categoryId, boolean randomOrder, boolean multiPage,
        boolean immediateCorrection, boolean allowPractice) {
    this.id = id;
    this.name = name;
    this.creatorId = creatorId;
    this.timeCreated = timeCreated;
    this.categoryId = categoryId;
    this.randomOrder = randomOrder;
    this.multiPage = multiPage;
    this.immediateCorrection = immediateCorrection;
    this.allowPractice = allowPractice;
}

【问题讨论】:

  • 我想没有办法。但我可能错了。
  • 你在用spring吗?
  • @alfasin - 我也在考虑类似的思路......但这种方法会非常缓慢。 :)
  • 如果您有更多实例变量,那么您可以使用构建器模式,也可以使用伸缩构造器模式或 JavaBeans 模式。作为有效的java builder模式更好用。 在面对许多构造函数参数时考虑使用构建器

标签: java constructor initialization instance-variables


【解决方案1】:

不幸的是,没有更简单的方法来初始化实例变量——你必须在构造函数中编写这样的初始化代码。

然而,所有现代 IDE(如 IntelliJ IDEA、Eclipse 等)都可以根据实例变量自动生成此类构造函数,因此您不必手动编写此类代码。 (例如在 IntelliJ IDEA 中按 Alt+Insert,选择 Constructor,选择您需要的变量并生成构造函数代码)。

另外,如果你有很多变量需要在构造函数中传递和初始化(尤其是如果不是所有的变量都是必需的)——考虑使用模式生成器(不幸的是,你将不得不编写更多的代码!) .下面是一个如何实现 Builder 的例子:http://www.javacodegeeks.com/2013/01/the-builder-pattern-in-practice.html

【讨论】:

    【解决方案2】:

    没有,但是你应该参考builder的方法,因为那里有很多parameters / arguments的构造函数。

    builder 将使对象创建可读、不易出错并有助于线程安全。

    查看When would you use the Builder Pattern? 了解详细信息和示例。

    【讨论】:

    • 我不同意。生成器模式通常用于类中的可插入组件。我在这里看不到这样的东西
    • 很好,但也请查看链接。所有的细节都在那里,特别是阅读来自 Effective Java 的 Blochs 先生的声明。
    【解决方案3】:

    您可以使用工厂方法,其作用类似于构造函数,但实际上返回主类的匿名子类。匿名子类的方法只要声明为final,就可以访问工厂方法的参数。所以这种技术只能用于永不改变的字段。

    import java.util.Date;
    
    abstract class Quiz{
    
      static Quiz newQuiz(final int id, final String name, final int creatorId, final Date timeCreated,
                          final int categoryId, final boolean randomOrder, final boolean multiPage,
                          final boolean immediateCorrection, final boolean allowPractice) {
    
        // Return anonymous subclass of Quiz
        return new Quiz(){
    
          @Override
          public String someMethod() {
            // Methods can access newQuiz parameters
            return name + creatorId + categoryId + timeCreated;
          }
    
          @Override
          public boolean someOtherMethod() {
            // Methods can access newQuiz parameters
            return randomOrder && multiPage && allowPractice;
          }
    
        };
      }
    
      public abstract String someMethod();
      public abstract boolean someOtherMethod();
    
    
      public static void main(String[] args) {
        Quiz quiz = Quiz.newQuiz(111, "Fred", 222, new Date(), 333, false, true, false, true);
        System.out.println(quiz.someMethod());
        System.out.println(quiz.someOtherMethod());
      }
    
    }
    

    【讨论】:

      【解决方案4】:

      Project Lombok 有一系列类注释,您可以添加到您的类中,这些注释将生成您描述的那种构造函数。在此处查看@NoArgsConstructor、@RequiredArgsConstructor 和@AllArgsConstructor:

      https://projectlombok.org/features/index.html

      Lombok 中可用的其他注释对于从类中删除样板文件同样具有魔力,请看一看。 Lombok 非常棒,IntelliJ Idea 为调试和测试 Lombok 注释类提供了良好的插件支持。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-27
        • 2015-02-19
        相关资源
        最近更新 更多