我的结构如下
Interface A
Interface B extends Interface A
abstract Class C implements Interface B
now concrete Class D extends Class C
现在我在另一个类中使用接口B并返回具体的类D对象。
接口B包含getter和setter以及修改方法。
我想要的是我想以某种方式取出接口B中的所有getter并将它们放在一个单独的接口中,这样当我返回一个具体对象时,我无法访问接口B的setter和modifiers。但是我希望使用这个新构建的只读具体对象将Interface B用作我的返回对象。我不知道如何实现这个目标?
答案 0 :(得分:1)
实现此目的的一种方法是创建一个只读包装器对象,该对象实现接口B,将getter传播到包装对象并从内部引发异常(如IllegalAccessEXception
或InvalidStateException
)二传手和修饰符。
答案 1 :(得分:0)
听起来您指的是代理设计模式:http://en.wikipedia.org/wiki/Proxy_pattern。
在您的情况下,您希望接口B支持获取/设置某些字段,但您希望它提供特定的代理来设置和获取这些字段,而不是直接编辑它们。
这种情况很少发生,但您可以创建一个内部接口,该接口是您要支持的接口的特定和本地接口。例如:
public interface Proxiable {
public static interface Proxy
{
}
public ProxySub getProxy();
}
因此,您的界面正在定义代理接口 - 扩展您的接口的任何人都必须配置代理提供程序。
但是,除非你有充分的理由这样做,否则你可能会过度抽象。接口是通用的,通常足以让HOW方法的细节实现为子类,而不是在接口级别强制使用上层结构。
答案 2 :(得分:0)
阐述@rsp的优秀建议:
创建“只读”界面
public interface MyInterfaceRO {
public int getFoo();
public String getBar();
// etc...
}
创建与您的B
对应的“读写”界面 public interface MyInterfaceRW extends MyInterfaceRO {
public void setFoo(int foo);
public void setBar(String bar);
// ...
}
IMO,做你想做的最简单的方法(防止修改)就是返回MyInterfaceRO。调用者(除非他们进行强制转换)将无法调用setFoo(),事实上,在他们的IDE中,他们甚至不会看到.setFoo()作为选项。
我不明白为什么你真的想要返回一个B类(我上面的RW),但是,如果你这样做,你就会遇到能够看到并调用setFoo()的调用者。可能你最好的选择是遵循java的Collections中设置的先例并抛出UnsupportedOperationException。为方便起见,您可以提供方法
public boolean isModifiable();
但是你不能强迫调用者使用和尊重它。