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),所以很遗憾不能使用枚举类型。
接口描述服务,因此如果常量是服务的描述或定义的一部分,它应该在接口中,因此该接口的每个实现都可以重用它们。在你的情况下,例如常量应该转到界面
我认为你的"在界面中放置常量通常被认为是不好的做法"声明实际上只适用于你使用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 ( ) ; } |