假设我有一些类对于一个具体案例来说方法过于丰富,但适合其中的一半左右,所以只能扩展它。同时,我想向最终用户隐藏我已经扩展了这个胖类的事实。然后我想用一些新接口限制那个类,让不需要的方法抛出一个UnsupportedOperationException
:
public class TooFatClass {
public void usefulMethodOne() { ... };
public void usefulMethodTwo() { ... };
public void usefulMethodThree() { ... };
...
public void notUsefulMethodOne() { ... };
public void notUsefulMethodTwo() { ... };
public void notUsefulMethodThree() { ... };
...
}
public interface OnlyUsefulMethods {
public void usefulMethodOne();
public void usefulMethodTwo();
public void usefulMethodThree();
...
public static OnlyUsefulMethods create() {
return new OnlyUsefulMethodsImpl();
}
}
// notice it is package-private
class OnlyUsefulMethodsImpl extends TooFatClass implements OnlyUsefulMethods {
public void usefulMethodOne() { ... };
public void usefulMethodTwo() { ... };
public void usefulMethodThree() { ... };
...
public void notUsefulMethodOne() { throw new UnsupportedOperationException(); };
public void notUsefulMethodTwo() { throw new UnsupportedOperationException(); };
public void notUsefulMethodThree() { throw new UnsupportedOperationException(); };
...
}
因此,如果用户真的想要,可以将OnlyUsefulMethodsImpl
实例强制转换为,但它隐藏了这个事实并且不强制用户这样做。TooFatClass
但是,java 不允许在接口中实现静态方法(OnlyUsefulMethods
我认为将其抽象化是愚蠢的),所以我以这段臭代码结束:
public interface OnlyUsefulMethods {
public void usefulMethodOne();
public void usefulMethodTwo();
public void usefulMethodThree();
...
public static final class Factory {
public static OnlyUsefulMethods create() { return new OnlyUsefulMethodsImpl(); }
public static OnlyUsefulMethods create(Options options) {
return new OnlyUsefulMethodsImpl(options); }
}
}
即使我将移动Factory
接口外部,它看起来太复杂而无法仅用于一个类案例,我想要一个工厂方法而不显示OnlyUsefulMethodsImpl
外部。
我做错了什么/太复杂并且缺少一些限制模式吗?
可能与这个问题有关(无论如何,有一些答案可能合适,我不确定):