我想在调用方法时显示编译时错误。
就像我有一个“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();
}
}
答案 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总是先被调用。