阻止显式调用可覆盖的方法(Java)

时间:2016-05-19 13:06:06

标签: java annotations java-annotations

我有许多定义方法的类,我希望围绕该方法执行一些代码(比如,一些" prologue"和#34; epilogue"):

public interface Thing {
    public void stuff();
    public void callStuff();
}
public abstract class Something implements Thing {
    public abstract void stuff();
    public void callStuff() {
        ... // common prologue
        //try {
            stuff();
        //} finally {
            ... // common epilogue
        //}
    }
}
public class A extends Something {
    public void stuff() { ... }
}
public class B extends Something {
    public void stuff() { ... }
}
public class Wrapper extends Thing {
    private Thing t;
    Wrapper(Thing thing) { t = thing; }
    public void stuff() { t.stuff(); }
    public void callStuff() { t.callStuff(); }
}

// Use:
Something s = ...;
s.callStuff();

您看到的想法是,子类将重新定义 stuff() ,而客户端将调用 callStuff() 。然而,在极少数情况下,必须致电 stuff() ,请参阅上面的Wrapper

我们在Thread类中看到的内容(自JDK 1.0起),子类重新定义 run() ,但客户端调用 start() < / em>的

如何阻止客户直接致电stuff()

修改

protected在这里不起作用,因为&#34;客户&#34;真的是由另一个团队编码的Something的孩子。 @Deprecated可行,但 stuff() 并未真正弃用,并且每个人都知道&#34;已弃用&#34;是的,所以我无法重新定义@Deprecated的含义。

理想情况下,除非给出明确的指令来忽略问题,否则编译应该失败。

0 个答案:

没有答案