关于java:应该将常量放在接口中吗?

Should constants ever be placed in an interface?

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

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

1
2
3
4
interface DownloadListener
{
    public void sendEvent(int eventId);
}

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

1
2
3
4
5
6
7
8
9
10
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),所以很遗憾不能使用枚举类型。


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


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

我认为你的"在界面中放置常量通常被认为是不好的做法"声明实际上只适用于你使用Constant Interface反模式的情况。


记得要从常量界面反模式中明确:
http://en.wikipedia.org/wiki/Constant_interface


扩展Voo的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 ;
}


那很好,但我真的用一个手动枚举替换int,类似于:

1
2
3
4
5
6
7
public class MyEnum {
    public final static MyEnum ENUM_1 = new MyEnum();
    public final static MyEnum ENUM_2 = new MyEnum();

    private MyEnum() {
    }
}

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

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


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

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

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


似乎必须有更好的方法。

1
2
3
4
5
6
interface DownloadListener
{
    public void downloadStarted ( ) ;

    public void downloadCompleted ( ) ;
}