gpt4 book ai didi

java - 不变性与类中的状态变化

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:26 25 4
gpt4 key购买 nike

我对不可变类的概念相当陌生。考虑这个类:

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();
}
}
}

我试图了解如何将此类更改为不可变类。

特别是,我看不出如何将 boolean 字段 isConnected 设为最终字段,因为它表示连接状态。

ConnectionMonitor 的所有客户端应该只查询isConnected() 获取连接状态。

我知道可以或使用原子 boolean 值锁定对 isConnected 的更改。

但我不知道如何将其重写为不可变类。

最佳答案

理想的是最小化可变性——而不是消除它。

不可变对象(immutable对象)有很多优点。它们简单、线程安全并且可以自由共享。

但是,有时我们需要可变性。

在“Effective Java”中,Joshua Bloch 建议了以下准则:

  • Classes should be immutable unless there's a very good reason to make them mutable.
  • If a class cannot be made immutable, limit its mutability as much as possible.

在您的示例中,类的实例可变是有充分理由的。但您也可以看到第二条准则在起作用:字段 monitorObject 被标记为最终的。

关于java - 不变性与类中的状态变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33401174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com