Enum
У Java впечатляющая возможность перечисления. Гораздо более мощный и практичный, чем целочисленный с меткой в других языках. См. Oracle Tutorial .
package work.basil.example;
public enum CurrierStatus
{
WAITING,
WORKING;
}
Когда этот класс CurrierStatus
загружается, автоматически создается пара объектов, каждому из которых присваивается одно из этих имен WAITING
& WORKING
.
Интерфейс
Конечно, интерфейс в Java не может определять переменную-член. В качестве альтернативы мы можем определить метод доступа getter .
Определите метод получения getStatus
в интерфейсе Currier
, чтобы вернуть один из этих двух предопределенных объектов.
package work.basil.example;
public interface Currier
{
CurrierStatus getStatus();
// blah, blah, other methods defined.
}
В ваших конкретных классах определите переменную-член для хранения любого из объектов перечисления CurrierStatus
. Установите переменную состояния путем инъекции через конструктор или добавьте метод установки, как угодно. Реализуйте требуемый метод get для возврата текущего объекта enum состояния.
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 { … }
… и т. Д.
Кстати, попробуйте назвать ваши интерфейсы и абстрактные классы, не прибегая к префиксам / суффиксам для обозначения интерфейса. Называть сложно, но стоит. С хорошо разработанным набором классов, что такое интерфейс и что конкретно, не должно быть таким очевидным. (вообще говоря)