Должны ли константы когда-либо помещаться в интерфейс? - PullRequest
4 голосов
/ 08 декабря 2011

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

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

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

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

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.

Ответы [ 7 ]

10 голосов
/ 08 декабря 2011

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

4 голосов
/ 08 декабря 2011

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

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

2 голосов
/ 08 декабря 2011

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

2 голосов
/ 08 декабря 2011

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

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 ;
}
1 голос
/ 08 декабря 2011

Это хорошо, но я бы на самом деле заменил 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 ..) и это тип безопасно.

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

0 голосов
/ 08 декабря 2011

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

Кроме того, когда интерфейс реализуется многими классами и используется ими, имеет смысл размещатьэто в интерфейсе для удаления зависимости.

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

0 голосов
/ 08 декабря 2011

Кажется, должен быть лучший путь.

interface DownloadListener 
{
    public void downloadStarted ( ) ;

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