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

标签 java oop immutability

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

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/

相关文章:

ocaml - 如何在没有可变数据的情况下创建带有循环的图表?

javascript - 在 JavaScript 中返回一个带有一些额外属性的新对象

java - Java 中的持久数据结构

java - Observable vs Flowable rxJava2

r - R 中引用类的函数重载?

java - 我怎样才能实现一个 ActionListener 呢?

Java Map反模式?

java - 调用函数: two times or storing the result in a variable?哪个更好

java - 使用 jsoup 从具有可变页面数据的 'form' 类中提取文本

java - SOAP Web 服务中的用户身份验证