强制执行一个名为java的方法

时间:2015-06-15 10:34:53

标签: java

我有一组这样形式的A1An的课程:

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()除外)。

3 个答案:

答案 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
        }
    }
    ...
}