Вопрос в заголовке немного обобщен, и многие другие подобные вопросы уже были отвечены, поэтому я понимаю общую картину. В основном использование открытого поля в Java-классе создает зависимость от деталей реализации этого класса, что приводит к уменьшению количества программного обеспечения.Можно ли использовать общедоступные поля в Java?
Имея это в виду, у меня все еще возникает ощущение, что я могу как-то их использовать. Чтобы объяснить это, я буду использовать пример: с будущими функциональными интерфейсами Java 8 я наконец могу использовать модель событий, которая мне нравится, что похоже на то, как события обрабатываются на C#.
Модель события реализована в пакете, который предназначен для использования в качестве стороннего API во всех моих проектах. Таковы основные классы:
EventArgs.java
public class EventArgs implements Serializable {
}
EventHandler.java
@FunctionalInterface
public interface EventHandler<T extends EventArgs> {
void fire(Object sender, T args);
}
Event.java
public class Event<T extends EventArgs> {
private final Set<EventHandler<T>> handlers = new LinkedHashSet<>();
public void addEventHandler(EventHandler<T> handler) {
handlers.add(handler);
}
public void removeEventHandler(EventHandler<T> handler) {
handlers.remove(handler);
}
public void fire(Object sender, T args) {
for (EventHandler<T> e : handlers) {
e.fire(sender, args);
}
}
}
То, что я обычно люблю делать в моих классах которые хотят запускать события, это примерно так:
public class SomeClass {
public final Event<SomeEventArgs> someEvent = new Event<>();
public void someMethod() {
// ...
someEvent.fire();
}
}
и в классах, которые хотят, чтобы подписаться на событие:
public class SomeOtherClass {
private SomeClass someInstance;
public SomeOtherClass() {
someInstance = new SomeClass();
someInstance.someEvent.addEventHandler(this::someEventHandler);
}
private void someEventHandler(Object sender, SomeEventArgs args) {
// do some stuff ...
}
}
мне это кажется нормально, потому что я не выставляя никаких деталей реализации, на самом деле это событие является частью интерфейса класса. Я совсем не прав на этом? Шоуд, я все еще использую геттер для взаимодействия с событием?
Другим примером, о котором я могу думать, является регистратор, который используется в классе, но может быть установлен снаружи, чтобы получить определенный уровень детализации.
Итак, чтобы расширить вопрос, можно ли использовать публичный модификатор, если поле является сторонним компонентом, к которому можно получить доступ, чтобы достичь определенного поведения?
Я не активен на [programmers.SE] (http://programmers.stackexchange.com/), но это, возможно, было лучше подойдет там. – ydaetskcoR
Имея «Событие», обработчики событий немного странны, и именно поэтому вы оказались с переменными 'public', которые кажутся хорошей идеей. Перечитайте [The Observer Pattern] (http://en.wikipedia.org/wiki/Observer_pattern). –
@BoristheSpider, я думаю, что все дело в функциональных интерфейсах. Я думаю, что это не похоже на то, что «Событие» содержит сам обработчик, он больше похож на «Событие» содержит анонимный объект-делегат, который реализует функциональный интерфейс, я не вижу в этом ничего плохого. На самом деле мне кажется, что он очень похож на самого наблюдателя. –