Мне кажется, это ошибка не Java, а вашей командной оболочки. Попробуйте заключить в кавычки значение аргумента -cp
. Вот так:
>java -cp ".;D:\PackageTest\classes" TestCircle
Он будет указывать оболочке не пытаться интерпретировать ее как команду, а просто передать ее в программу Java, как есть.
Хорошо, предположите, что, например, Вы хотите, чтобы части Вашей программы были уведомлены, когда Ваш Загрузчик запускает сканирование, и когда это заканчивается, сканирование (не волнуйтесь о том, что Загрузчик, или каково сканирование, это примеры из некоторого кода, у меня есть ложь вокруг от моего последнего задания). Вы определяете интерфейс, называете его "ScanListener", как
public interface ScanListener
{
public void scanStarted();
public void scanCompleted();
}
Теперь Загрузчик определяет метод для Вашего другого кода для регистрации для обратных вызовов, как
public void addScanListener(ScanListener listener)
{
listeners.add(listener);
}
Загрузчик, когда это запускает сканирование, выполняет следующий код
for (ScanListener listener : listeners)
{
listener.scanStarted();
}
и когда это заканчивается, это делает то же самое с listener.scanCompleted ();
Код, который должен быть уведомлен относительно этих реализаций событий, которые взаимодействуют через интерфейс (или они, или во внутреннем классе), и вызовы "loader.addScanListener (это)". Его scanStarted () и scanCompleted () методы называют в подходящее время. Можно даже сделать это с обратными вызовами, которые берут результаты возврата и/или аргументы. Это - все до Вас.
Какие уведомления Вы ищете? Если все, что Вы хотите, для одного объекта смочь сказать кому-либо еще "эй, я изменился, обновите соответственно", самый легкий путь состоит в том, чтобы использовать существующий интерфейс Observer и Заметный класс. Или запишите свое собственное с интерфейсом, который определяет то, что Вы хотите быть обращенными слушатели от того, который это изменяется.
Нет никакого существующего ранее сервиса для каждого процесса, который диспетчеризирует события в Java, это эквивалентно NSNotificationCenter по умолчанию. В Java тип события указан объектом-событием, являющимся конкретным типом (который также означает, что метод уведомления зависит от того типа) вместо того, чтобы использовать строку. До дженериков, пишущий общему диспетчеру события и получателю, который также безопасен с точки зрения типов, не действительно возможно (засвидетельствуйте быстрое увеличение *Классы событий и *интерфейсы EventListener в библиотеках AWT и Spring).
Существуют некоторые средства для отправки события. Как Paul упомянул, существует java.util.Observable
, который, как Вы указываете, требует разделения на подклассы. Существует также java.beans.PropertyChangeSupport
, который мог быть полезным в зависимости от Вашей ситуации.
Вы могли также записать тот сами. Источник для PropertyChangeSupport
вероятно, доступно в openjdk, и Вы могли посмотреть на заброшенный Apache проект События палаты общин. В зависимости от Ваших потребностей Вам, вероятно, придется волноваться о материале как поточная обработка, seralization, утечки памяти (гарантирующий, чтобы дерегистрация или использующий слабые ссылки), и параллельная модификация (выполнили итерации по копии Вашего списка слушателей, поскольку слушатель может решить не зарегистрировать себя в ответ на изменение).
Теперь, когда дженерики существуют в Java, универсальная библиотека отправки события была бы возможна; однако, я не столкнулся ни с кем. Кто-либо?
Существует на самом деле средство, встроенное к Java, который делает точно, что Вы хотите, но это не что-то, что Вы, возможно, рассмотрели, и, честно говоря, вероятно немного тяжеловес для того, что Вы хотите.
Тем не менее однако это действительно существует.
Это - JMX.
Вы создаете MBeans, и затем другие могут зарегистрироваться для событий от тех MBeans. MBean может затем отправить Уведомления.
Я лично не рассмотрел бы использование его для этого случая (я просто загоню свое собственное), но средство там и это четко определено и зарегистрировано.
Не Java, но проект IPython имеет центр уведомления, записанный в Python здесь, что Вы могли использовать в качестве шаблона для версии Java.