自定义编译时错误

时间:2013-05-21 05:04:15

标签: java

我想在调用方法时显示编译时错误。

就像我有一个“MyClass”类,其中有两个方法“methodA()”和“methodB()”。 现在我创建一个“MyClass”的实例。使用这个实例我可以调用这两个方法,但如果我在“methodA()”之前调用“methodB()”,我需要显示编译时错误; 强文

class MyClasss
{
    public void methodA()
    {
        //do some thing
    }
    public void methodB()
    {
        //do some thing
    }
}
class MyRunningClasss
{
    public static void main(String... args)
    {
        MyClass MC = new MyClass();

        // it will not give any compile time error.
        MC.methodA();
        MC.methodB();

        // but it have to  give compile time error.
        MC.methodB();
        MC.methodA();

    }

}

2 个答案:

答案 0 :(得分:5)

你的建议并不容易。您需要下载OpenJDK并进行更改。这是一个非常大的代码库,所以我不建议你。

相反,我建议您添加运行时断言检查并对您的代码进行单元测试。如果您使用maven或ant在构建过程中运行测试,则会在构建时检测到这些错误,即使它是您的测试,也不是检测到错误的编译器。

如果您可以在编译时执行任何难以确定的事情,那么编译器的特别困难是什么。

e.g。

public static somethingA(int n) {
    // do something
    if(n == x)
       MC.methodA();
}

public static somethingB(int n) {
    // do something
    if(n == y)
        MC.methodB();
}

// is this a compile error or not
for(int i=0;i<10;i++) {
    somethingB(i);
    somethingA(i);
}

有很多模式,像这样的功能会很有用,这很难解决。例如在Lock.lock()之后确保你使用Lock.unlock(),但你可以将它们放在不同的方法中,或者在它们上加条件。

答案 1 :(得分:2)

考虑以下代码:

void callOne(boolean b) {
    if (b) {
        methodA();
    else {
        methodB();
    }
}
void randomTry() {
    int x, y, z;
    x = 1 + Random.nextInt(1000);
    y = 1 + Random.nextInt(1000);
    z = 1 + Random.nextInt(1000);
    boolean b = (x*x*x + y*y*y == z*z*z);
    callone(b);
    callOne(!b);
}

编译器必须证明Fermat的最后定理才能弄清楚methodB总是先被调用。