繁体   English   中英

需要有关结构接口的建议

[英]Need an advice on structuring interfaces

我有一个如下的结构

   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中取出所有吸气剂,并将它们放在一个单独的接口中,这样当我返回一个具体对象时,我将无法访问接口B的设置器和修饰符。但是我想要将接口B用作此新建只读混凝土对象的返回对象。 我不知道如何实现这一目标?

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

听起来您是在指代Proxy设计模式: http : //en.wikipedia.org/wiki/Proxy_pattern

在您的情况下,您希望接口B支持某些字段的获取/设置,但是您希望它为设置和获取这些字段提供特定的代理,而不是直接对其进行编辑。

很少这样做,但是您可以创建一个内部接口,该接口对于要支持的接口来说是特定的并且是本地的。 例如 :

public interface Proxiable {

    public static interface Proxy
    {

    }


    public ProxySub getProxy();
}

因此,您的界面正在定义代理界面-扩展您的界面的任何人都必须提供代理提供者。

但是,除非您有充分的理由这样做,否则您可能会过于抽象。 接口足够通用,通常只需将HOW方法的细节留给子类,而不是在接口级别强制使用此超结构即可。

详细阐述@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。 为方便起见,您可以提供一种方法

公共布尔isModifiable();

但您不能强迫呼叫者使用并遵守。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM