Ввод кодов состояния в интерфейс Java - PullRequest
0 голосов
/ 20 мая 2019

Мне нужен способ получить статус класса, который реализует интерфейс. Считается ли плохой практикой помещать статические значения в реальный интерфейс?

Было бы 4 класса курьера, которые реализуют интерфейс, все с одинаковыми статусами возврата.

public interface CurrierIF {

    public static final int WAITING = 0;
    public static final int WORKING = 1;

    void fetch(Shipment shipment);

    List<Service> getServices();

    int getStatus();
}

1 Ответ

1 голос
/ 21 мая 2019

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 { … }

… и т. Д.

Кстати, попробуйте назвать ваши интерфейсы и абстрактные классы, не прибегая к префиксам / суффиксам для обозначения интерфейса. Называть сложно, но стоит. С хорошо разработанным набором классов, что такое интерфейс и что конкретно, не должно быть таким очевидным. (вообще говоря)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...