【问题标题】:Should constants ever be placed in an interface?常量是否应该放置在接口中?
【发布时间】:2012-01-15 12:02:45
【问题描述】:

我知道在接口中放置常量通常被认为是不好的做法,但是...

我正在使用观察者模式将事件从对象广播到侦听器。

interface DownloadListener 
{
    public void sendEvent(int eventId);
}

广播器使用常量整数告诉监听器发生了哪个事件。

class DownloadTask 
{
    public static final int EVENT_DOWNLOAD_STARTED = 1;
    public static final int EVENT_DOWNLOAD_COMPLETED = 2; //should these go here?

    DownloadTask(DownloadListener listener)
    {
        listener.sendEvent(EVENT_DOWNLOAD_STARTED);
    }
}

将常量放在接口内会更好吗?我的想法是接口是广播者和听众之间的契约,因此它应该包含该契约的细节(常量)。

我正在为移动设备(Java 1.3)开发,所以很遗憾不能使用枚举类型。

【问题讨论】:

  • 我确信接口中的常量没有问题

标签: java oop design-patterns


【解决方案1】:

接口描述服务,所以如果常量是服务描述或定义的一部分,它应该放在接口中,所以该接口的每个实现都可以重用它们。在您的情况下,例如常量应该转到界面

【讨论】:

    【解决方案2】:

    interface 似乎是他们可以接受的地方。

    我认为您的“在接口中放置常量通常被认为是不好的做法” 声明仅在您使用Constant Interface anti-pattern 时才适用。

    【讨论】:

      【解决方案3】:

      扩展Voo's answer

      interface DownloadListener 
      {
          public void sendEvent(MyEnum eventId);
      
          public class MyEnum
          {
              private final static MyEnum ENUM_1 = new MyEnum();
              private final static MyEnum ENUM_2 = new MyEnum();
      
              private MyEnum()
              {
              }
          }
      
          public static final MyEnum EVENT_DOWNLOAD_STARTED = MyEnum . ENUM_1;
          public static final MyEnum EVENT_DOWNLOAD_COMPLETED = MyEnum . ENUM_2 ;
      }
      

      【讨论】:

      • +1 没有意识到你可以做到这一点,很好的答案。不知道为什么它被否决了。
      【解决方案4】:

      记住要避开常量接口反模式http://en.wikipedia.org/wiki/Constant_interface

      【讨论】:

        【解决方案5】:

        这很好,但我真的会用手动枚举替换 int,例如:

        public class MyEnum {
            public final static MyEnum ENUM_1 = new MyEnum();
            public final static MyEnum ENUM_2 = new MyEnum();
        
            private MyEnum() {
            }
        }
        

        如果您有时需要其他信息,则易于扩展(如果您有 String 属性并覆盖 String 与 int 相比,调试会更简单),并且它是类型安全的。

        有一个缺点是你不能在接口定义本身中声明它,但是你可以在接口方法定义中使用枚举,这应该足够好了。

        【讨论】:

        • 很好的答案,但你为什么不能在接口定义本身中声明它。它似乎对我有用 - stackoverflow.com/a/8424867/348975.
        • @emory 我..我是..什么?为什么你可以在接口中定义一个公共类?那.. 我无语了,哇,我已经用 Java 写了很多年了,我以为我真的知道这种语言 :( 所以唯一的原因真的是我的无知,你的解决方案真的好多了。
        【解决方案6】:

        看来必须有更好的办法。

        interface DownloadListener 
        {
            public void downloadStarted ( ) ;
        
            public void downloadCompleted ( ) ;
        }
        

        【讨论】:

          【解决方案7】:

          从历史上看,常量被放置在接口中,因为接口很少比实现的具体类更频繁地更改。

          另外,当一个接口被许多类实现并被它们使用时,将它放在接口中以消除依赖关系是有意义的。

          对于 Java 5 及更高版本,我相信您应该为此目的查看 enum 数据结构,并注意 enum 不能放在接口中。它可以放在一个类中,也可以单独放置。

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-08-18
          • 1970-01-01
          • 2013-11-27
          • 2016-10-18
          • 2016-01-10
          • 2010-12-13
          • 1970-01-01
          相关资源
          最近更新 更多