Следует ли вообще помещать константы в интерфейс?



Я знаю, что размещение констант в интерфейсе обычно считается плохой практикой, но...



Я использую шаблон наблюдателя для трансляции событий от объекта к слушателю.

interface DownloadListener 
{
public void sendEvent(int eventId);
}


Вещатель использует постоянные ints, чтобы сообщить слушателю, какое событие произошло.

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), поэтому, к сожалению, не могу использовать тип enum.

687   7  

7 ответов:

Интерфейсы описывают службы, поэтому, если константа является частью описания или определения службы, она должна входить в интерфейс, чтобы каждая реализация этого интерфейса могла повторно использовать их. В вашем случае, например, константы должны идти в интерфейс

interface кажется приемлемым местом для них.

Я думаю, что ваше"размещение констант в интерфейсе обычно считается плохой практикой" заявление действительно применимо только в том случае, если вы используетепостоянный интерфейс анти-паттерн .

Расширение Ответ Ву

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 на ручное перечисление, что-то вроде:

public class MyEnum {
    public final static MyEnum ENUM_1 = new MyEnum();
    public final static MyEnum ENUM_2 = new MyEnum();

    private MyEnum() {
    }
}

Легко расширяется, если вам когда-нибудь понадобится дополнительная информация (отладка проще, если у вас есть свойство String и перезапись в String по сравнению с int..) и это тип-сейф.

Имеет недостаток, что вы не можете объявить его в самом определении интерфейса, но вы можете использовать перечисление в определениях метода интерфейса, которые должны быть достаточно хороши.

Не забудьте держаться подальше от констант интерфейса анти-паттерна : http://en.wikipedia.org/wiki/Constant_interface

Похоже, что должен быть лучший способ.

interface DownloadListener 
{
    public void downloadStarted ( ) ;

    public void downloadCompleted ( ) ;
}

Исторически константы помещаются в интерфейсы, потому что интерфейс редко меняется чаще, чем реализующие конкретные классы.

Также, когда интерфейс реализуется многими классами и используется ими, имеет смысл поместить его в интерфейс, чтобы удалить зависимость.

С Java 5 и выше я считаю, что вы должны смотреть на структуру данных enum для этой цели, и обратите внимание, что enum не может быть помещен в интерфейс. Его можно поместить в класс, или сам по себе.

Comments

    Ничего не найдено.