需要关于结构化接口的建议

时间:2011-12-23 16:31:24

标签: java interface

我的结构如下

   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用作我的返回对象。我不知道如何实现这个目标?

3 个答案:

答案 0 :(得分:1)

实现此目的的一种方法是创建一个只读包装器对象,该对象实现接口B,将getter传播到包装对象并从内部引发异常(如IllegalAccessEXceptionInvalidStateException)二传手和修饰符。

答案 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();

但是你不能强迫调用者使用和尊重它。