2

Pointクラスを定義しました:

public class Point {
    ...
    public String toString() {
        return "abc";
    }
}

toString()誰もそのメソッドをオーバーライドしないように注意する必要がある側面と同様に:

declare error
    : execution(public String Point+.toString()) && !execution(public String Point.toString()) 
    : "Forbidden execution operation!";

declare error
    : call(public String Point+.toString()) && !call(public String Point.toString()) 
    : "Forbidden call operation!";

ただし、次のコードを入力しても、エラーのフラグはまったく立てられません。

class Point4 extends Point {
    public Point4(int x, int y) {
        super(x, y);
    }

    @Override
    public String toString() { //I'd be expecing a compilation error here.
        return super.toString();
    }
}

public class Main {
    public static void main(String[] args) {
        Point4 p = new Point4(2, 3);
        System.out.println(p.toString()); //I'd be expecting a compilation error here
    }
}

私は何を間違っていますか?

ありがとう

4

1 に答える 1

1

この宣言エラーは、無効なtoStringメソッドのすべての宣言をキャッチします。

declare error
: !within(Point) && execution(public String Point.toString()) 
: "Forbidden call operation!";

これで道半ばです。他の部分はこれを使用することです:

declare error
: call(public String (Point+ && !Point).toString())
: "Forbidden call operation";

この宣言のバリアントが機能しない理由は正確にはわかりませんが、上記のポイントカットはより短く、より明示的で推奨されています(そして最も重要なのは...正しく機能することです)。

于 2013-05-13T17:51:33.077 に答える