Sono abbastanza nuovo al concetto di classi immutabili. Considerate questa classe:Immutabilità vs cambio di stato in una classe
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();
}
}
}
Sto cercando di capire come questa classe potrebbe essere cambiato ad uno immutabile.
In particolare, non vedo come il campo booleano isConnected
possa essere reso definitivo, poiché rappresenta lo stato della connessione.
Tutti i client di ConnectionMonitor
devono solo richiedere isConnected()
per ottenere lo stato della connessione.
Sono consapevole che il blocco delle modifiche su isConnected
è possibile o si utilizza un booleano atomico.
Ma non vedo come riscrivere questo in una classe immutabile.
Non tutti gli oggetti devono essere immutabili. –
Quindi mi serve solo più esperienza per giudicare quando creare classi mutevoli/immutabili ?! – Juergen
L'esperienza aiuta. In generale, preferisci l'immutabilità quando possibile, ma solo quando possibile. Ho aggiunto più dettagli in una risposta qui sotto. –