我有一组这样形式的A1
到An
的课程:
public class A1{
//constructor method
public A1(...){...}
//init method
public void init(){...}
//some class specific method
...
}
我想确保在类初始化之后始终调用方法init
(如果不使用,可能是编译器错误或某种警告)。
类似的东西:
A1 a1=new A1(...);
//some other code that may relate to a1 (e.g. changing default global values)
a1.init(); // <-- if not used some bad things happens.
唯一的限制是:
我无法在构造函数
中使用init()
方法
有没有办法做到这一点? (当然,在构造函数中调用init()
除外)。
答案 0 :(得分:4)
您可以像这样重组您的课程:
public class A1{
//constructor method
private A1(...){...}
//init method
private void init(){...}
//some class specific method
...
public static A1 create(...) {
A1 ret = new A1(...);
ret.init();
return ret;
}
}
出于其他原因,使用静态工厂方法而不是构造函数也是可取的,您可以为它们提供更具表现力的名称,并且可以以不能重载构造函数的方式重载它们。
P.s。:您可以在Josh Bloch的Effective Java中阅读更多相关内容,这是第1项,但其他对象创建技巧也适合您的情况。
答案 1 :(得分:2)
您可以将init()
方法的主体提取到初始化程序块。类似的东西:
public class A1 {
{
//here goes the body of the init() method
//this will always be executed before the constructor
}
//constructor
public A1() { }
}
它将在每个类实例创建之前(即在构造函数之前)执行。
当您使用A1 instance = new A1()
实例化类时,初始化程序块将首先执行始终,然后执行构造函数体。这适用于您创建的每个类的实例。
答案 2 :(得分:1)
在类中创建一个boolean为false,在init()中将其设置为true,并且如果不为true则避免调用任何方法。
public class A1{
boolean initialized = false;
//constructor method
public A1(...){...}
//init method
public void init()
{
// do init stuff
initialized = true;
}
//some class specific method
public void myMethod() {
if(!initialized) {
// print error
} else {
// do your stuff
}
}
...
}