将状态代码放入Java接口

将状态代码放入Java接口,java,interface,Java,Interface,我需要一种方法来获取实现接口的类的状态。将静态值放在实际接口中是否被认为是不好的做法 将有4个courier类实现该接口,它们都具有相同的返回状态 公共接口CurrierIF{ 公共静态最终整数等待=0; 公共静态最终整型工作=1; 无效提取(装运); 列出getServices(); int getStatus(); } Enum Java具有令人印象深刻的枚举功能。与其他语言相比,integer-with-a-label更强大、更实用。看 当加载此CurrierStatus类时,会自动实例化

我需要一种方法来获取实现接口的类的状态。将静态值放在实际接口中是否被认为是不好的做法

将有4个courier类实现该接口,它们都具有相同的返回状态

公共接口CurrierIF{
公共静态最终整数等待=0;
公共静态最终整型工作=1;
无效提取(装运);
列出getServices();
int getStatus();
}
Enum Java具有令人印象深刻的枚举功能。与其他语言相比,integer-with-a-label更强大、更实用。看

当加载此
CurrierStatus
类时,会自动实例化一对对象,每个对象都被分配给那些名称中的一个
等待
工作

接口 当然,Java中的接口不能定义成员变量。或者,我们可以定义一个getter

Currier
接口上定义一个getter方法
getStatus
,以返回这两个预定义对象中的一个

package work.basil.example;

public interface Currier
{
    CurrierStatus  getStatus();

    // blah, blah, other methods defined.
}
在具体的类中,定义一个成员变量来保存
CurrierStatus
enum对象。通过构造函数注入设置状态变量,或者添加setter方法,等等。实现所需的getter方法以返回当前持有的状态枚举对象

package work.basil.example;

public class CurrierDomestic implements Currier
{
    private CurrierStatus status;

    // Constructor
    public CurrierDomestic ( CurrierStatus status )
    {
        this.status = status;
    }

    @Override
    public CurrierStatus getStatus ()
    {
        return this.status;
    }
}
使用它

Currier currier = new CurrierDomestic( CurrierStatus.WORKING ) ;

System.out.println( "The currier status is: " + currier.getStatus() ;
抽象类 我写了上面的接口材料,因为你在问题中提出了这样的要求

在实际工作中,如果我确实知道我希望
Currier
的每个排列、每个具体类都持有
CurrierStatus
对象引用,我会将
Currier
定义为一个抽象类,而不是一个接口

package work.basil.example;

public abstract class Currier
{
    private CurrierStatus status;

    // Constructor
    public Currier ( CurrierStatus status )
    {
        this.status = status;
    }

    public CurrierStatus getStatus ()
    {
        return this.status;
    }

    // blah, blah, other methods defined.
}
然后我们的具体类将扩展抽象类,而不是实现接口

public class CurrierDomestic extends Currier { … }
……还有

public class CurrierForeign extends Currier { … }
……等等


顺便说一下,请尝试命名接口和抽象类,而不要使用前缀/后缀来表示接口。命名很难,但值得。对于一组设计良好的类,什么是接口,什么是具体的不需要如此明显。(一般来说)

为什么不使用
enum
?如果您还需要一些外部交互的整数值,您可以向enum添加一个提供相应整数值的方法。Josh Bloch将其称为“常量接口反模式”,其上的
int
不是状态类型,而是可计算类型。其他评论者认为这是
enum
的情况,这是正确的。
public class CurrierForeign extends Currier { … }