我知道将常量放在界面中通常被认为是不好的做法,但是......
我正在使用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)开发,但遗憾的是无法使用枚举类型。
答案 0 :(得分:10)
接口描述服务,因此如果常量是服务的描述或定义的一部分,它应该在接口中,因此该接口的每个实现都可以重用它们。在您的情况下,例如常量应该转到界面
答案 1 :(得分:4)
interface
似乎是他们可以接受的地方。
我认为你的"将常量放在界面中通常被认为是不好的做法" 语句真的只适用于你使用Constant Interface anti-pattern的情况。
答案 2 :(得分:2)
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及更高版本,我相信您应该为此目的查看枚举数据结构,并注意枚举不能放在接口中。它可以放在一个类中,也可以放在一个类中。