0

我有许多定义方法的类,我想围绕该方法执行一些代码(例如,一些“序言”和“尾声”):

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().

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

编辑

protected在这里不起作用,因为“客户”确实是Something另一个团队编码的孩子。@Deprecated会起作用,但stuff()并没有真正被弃用,而且每个人都知道“弃用”是什么,所以我无法重新定义@Deprecated.

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

4

0 回答 0