作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对不可变类的概念相当陌生。考虑这个类:
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/
我是一名优秀的程序员,十分优秀!