Ich bin ziemlich neu in das Konzept der unveränderlichen Klassen. Betrachten Sie diese Klasse:Unveränderlichkeit vs Zustandswechsel in einer Klasse
public class ConnectionMonitor implements MessageConsumer {
private final MonitorObject monitorObject;
private boolean isConnected = true;
private final static Logger logger = LogManager.getLogger(ConnectionMonitor.class);
public ConnectionMonitor(final MonitorObject monitorObject) {
this.monitorObject = monitorObject;
}
public boolean isConnected() {
return isConnected;
}
public void waitForReconnect() {
logger.info("Waiting for connection to be reestablished...");
synchronized (monitorObject) {
enterWaitLoop();
}
}
private void enterWaitLoop() {
while (!isConnected()) {
try {
monitorObject.wait();
} catch (final InterruptedException e) {
logger.error("Exception occured while waiting for reconnect! Message: " + e.getMessage());
}
}
}
private void notifyOnConnect() {
synchronized (monitorObject) {
monitorObject.notifyAll();
}
}
@Override
public void onMessage(final IMessage message) {
if (message.getType() == IMessage.Type.CONNECTION_STATUS) {
final String content = message.getContent();
logger.info("CONNECTION_STATUS message received. Content: " + content);
processConnectionMessageContent(content);
}
}
private void processConnectionMessageContent(final String messageContent) {
if (messageContent.contains("Disconnected")) {
logger.warn("Disconnected message received!");
isConnected = false;
} else if (messageContent.contains("Connected")) {
logger.info("Connected message received.");
isConnected = true;
notifyOnConnect();
}
}
}
Ich versuche zu verstehen, wie diese Klasse zu einem unveränderlichen einem geändert werden könnte.
Insbesondere sehe ich nicht, wie das boolesche Feld isConnected
endgültig gemacht werden könnte, da es den Verbindungsstatus darstellt.
Alle Clients von ConnectionMonitor
sollten nur isConnected()
abfragen, um den Verbindungsstatus zu erhalten.
Ich bin mir bewusst, dass Sperren Änderungen an isConnected
ist möglich oder mit einem atomaren boolean.
Aber ich sehe nicht, wie man dies in eine unveränderliche Klasse umschreiben kann.
Nicht alle Objekte sollten unveränderlich sein. –
Also brauche ich nur mehr Erfahrung zu beurteilen, wann man veränderbare/unveränderliche Klassen erstellen kann ?! – Juergen
Erfahrung hilft. Im Allgemeinen bevorzugen Sie die Unveränderlichkeit wenn möglich - aber nur wenn es möglich ist. Ich habe mehr Details in einer Antwort unten hinzugefügt. –