我有一个类似如下的结构
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和修饰符。但是我想使用接口B作为这个新构建的只读具体对象的返回对象。我不知道如何做到这一点?
发布于 2011-12-23 16:43:59
实现这一点的一种方法是创建一个只读包装器对象,该对象实现接口B,将getter传播到包装的对象,并从setter和修饰符中引发异常(如IllegalAccessEXception
或InvalidStateException
)。
发布于 2011-12-23 16:43:41
听起来您指的是代理设计模式:http://en.wikipedia.org/wiki/Proxy_pattern。
在您的例子中,您希望Interface B支持获取/设置某些字段,但您希望它提供一个特定的代理来设置和获取这些字段,而不是直接编辑它们。
这很少这样做,但您可以创建一个内部接口,它是特定于您想要支持的接口的本地接口。例如:
public interface Proxiable {
public static interface Proxy
{
}
public ProxySub getProxy();
}
因此,您的接口定义了一个代理接口--任何扩展您的接口的人都必须提供一个代理提供程序。
然而,除非你有一个很好的理由这样做,否则你可能会过于抽象。接口足够通用,通常将如何实现方法的细节留给子类就足够了,而不是在接口级别强制这种超结构。
发布于 2011-12-23 17:48:06
详细阐述@rsp的优秀建议:
创建“只读”界面
public interface MyInterfaceRO {
public int getFoo();
public String getBar();
// etc...
}
创建"read-write“接口,对应于您的B
public interface MyInterfaceRW extends MyInterfaceRO {
public void setFoo(int foo);
public void setBar(String bar);
// ...
}
做你想做的(防止修改)的最简单的方法就是返回MyInterfaceRO。调用者(除非他们进行强制转换)将没有能力调用setFoo(),事实上,在他们的集成开发环境中,他们甚至不会看到.setFoo()作为一个选项。
我不明白为什么你真的想返回一个类型B(上面是我的RW ),但是,如果你这样做了,你就会被拥有查看和调用setFoo()能力的调用者所困扰。您最好的选择可能是遵循java集合中设置的先例并抛出一个UnsupportedOperationException。为了方便起见,您可以提供一个方法
公共布尔型isModifiable();
但是你不能强迫调用者使用和尊重它。
https://stackoverflow.com/questions/8618378
复制相似问题