Следует ли вообще помещать константы в интерфейс?
Я знаю, что размещение констант в интерфейсе обычно считается плохой практикой, но...
Я использую шаблон наблюдателя для трансляции событий от объекта к слушателю.
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.
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