Die Frage im Titel ist etwas allgemein und viele ähnliche Fragen wurden bereits beantwortet, sodass ich das allgemeine Bild verstehe. Hauptsächlich führt die Verwendung eines öffentlichen Feldes in einer Java-Klasse zu einer Abhängigkeit von den Implementierungsdetails der Klasse, was zu weniger wartbarem Software führt.
Trotzdem habe ich das Gefühl, dass ich sie irgendwie verwenden kann. Um dies zu erklären, werde ich ein Beispiel verwenden: Mit dem Aufkommen der funktionalen Schnittstellen von Java 8 kann ich endlich ein Ereignismodell verwenden, das mir gefällt, das ähnlich funktioniert wie Ereignisse in C# behandelt werden.
Das Ereignismodell ist in einem Paket implementiert, das als Drittanbieter-API in all meinen Projekten verwendet werden soll. Das sind die Hauptklassen:
EventArgs.java
public class EventArgs implements Serializable {
}
EventHandler.java
@FunctionalInterface
public interface EventHandler {
void fire(Object sender, T args);
}
Event.java
public class Event {
private final Set> handlers = new LinkedHashSet<>();
public void addEventHandler(EventHandler handler) {
handlers.add(handler);
}
public void removeEventHandler(EventHandler handler) {
handlers.remove(handler);
}
public void fire(Object sender, T args) {
for (EventHandler e : handlers) {
e.fire(sender, args);
}
}
}
Was ich normalerweise in meinen Klassen machen möchte, die Ereignisse auslösen wollen, sieht so aus:
public class SomeClass {
public final Event someEvent = new Event<>();
public void someMethod() {
// ...
someEvent.fire();
}
}
und in den Klassen, die das Ereignis abonnieren möchten:
public class SomeOtherClass {
private SomeClass someInstance;
public SomeOtherClass() {
someInstance = new SomeClass();
someInstance.someEvent.addEventHandler(this::someEventHandler);
}
private void someEventHandler(Object sender, SomeEventArgs args) {
// mache etwas ...
}
}
Für mich scheint das in Ordnung zu sein, weil ich keine Implementierungsdetails offenlege, tatsächlich ist das Ereignis Teil der Schnittstelle der Klasse. Liege ich damit völlig falsch? Sollte ich trotzdem einen Getter verwenden, um mit dem Ereignis zu interagieren?
Ein weiteres Beispiel, an das ich denken kann, ist ein Logger, der in der Klasse verwendet wird, aber von außen auf eine bestimmte Detailstufe gesetzt werden kann.
Also, um die Frage zu erweitern, ist es in Ordnung, einen öffentlichen Modifikator zu verwenden, wenn das Feld eine Drittanbieterkomponente ist, auf die zugegriffen werden kann, um ein bestimmtes Verhalten zu erreichen?