应该将常量放在界面中吗?

时间:2011-12-07 23:57:41

标签: java oop design-patterns

我知道将常量放在界面中通常被认为是不好的做法,但是......

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

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

广播公司使用常量int来告诉听众哪个事件已经发生。

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)开发,但遗憾的是无法使用枚举类型。

7 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:4)

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

我认为你的"将常量放在界面中通常被认为是不好的做法" 语句真的只适用于你使用Constant Interface anti-pattern的情况。

答案 2 :(得分:2)

扩展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 ;
}

答案 3 :(得分:2)

请记住要清除常量界面反模式http://en.wikipedia.org/wiki/Constant_interface

答案 4 :(得分:1)

这没关系,但我真的用手动枚举替换int,如:

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

    private MyEnum() {
    }
}
如果你有时需要额外的信息,那么

很容易扩展(如果你有一个String属性,并且与int相比覆盖到String,则调试更简单),并且它是类型安全的。

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

答案 5 :(得分:0)

似乎必须有更好的方法。

interface DownloadListener 
{
    public void downloadStarted ( ) ;

    public void downloadCompleted ( ) ;
}

答案 6 :(得分:0)

历史上常量被放置在接口中,因为接口很少经常更改实现具体类。

此外,当一个接口由许多类实现并由它们使用时,将它放在接口中以删除依赖项是有意义的。

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