如果我有类似下面的代码作为构造函数,如果它们的所有名称都与参数名称相同,是否有一种简单的简便方法可以在一行中执行所有实例变量初始化?
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;
}
答案 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());
}
}