构造函数初始化实例变量

时间:2015-02-26 05:31:00

标签: java constructor initialization instance-variables

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

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;
}

4 个答案:

答案 0 :(得分:4)

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

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

另外,如果你需要在构造函数中传递和初始化这么多变量(特别是如果不是所有变量都需要) - 考虑使用patter Builder(不幸的是你将不得不编写更多的代码!) 。以下是如何实现Builder的示例:http://www.javacodegeeks.com/2013/01/the-builder-pattern-in-practice.html

答案 1 :(得分:2)

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

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

请查看When would you use the Builder Pattern?了解详情和样本。

答案 2 :(得分:1)

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

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

在Lombok中可用的其他注释同样具有神奇的功能,可以从类中删除样板,看一看。 Lombok非常棒,IntelliJ Idea为调试和测试Lombok注释类提供了很好的插件支持。

答案 3 :(得分:0)

您可以使用类似构造函数的工厂方法,但实际上返回主类的匿名子类。只要声明为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());
  }

}