2

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

就像我有一个类“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();

    }

}
4

2 回答 2

5

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

相反,我建议您添加运行时断言检查并对您的代码进行单元测试。如果您使用 maven 或 ant 将测试作为构建的一部分运行,则这些错误将在构建时检测到,即使是您的测试,而不是检测到错误的编译器。

如果您可以做许多在编译时难以确定的事情,是什么让编译器特别困难。

例如

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(),但您可以将它们放在不同的方法中,或者对它们设置条件。

于 2013-05-21T05:07:54.167 回答
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 的最后定理才能确定总是首先调用方法 B。

于 2013-05-21T05:35:41.947 回答