Java 如何对枚举建模,其中一个常量;行为;不同地

Java 如何对枚举建模,其中一个常量;行为;不同地,java,enumeration,Java,Enumeration,我有一个状态标签,它显示了一条消息,根据 当前状态。消息本身可能会有所不同(即可能有多个消息) 发送至错误)的消息,但清除状态不同,因为它不应该 显示任何消息 示例用法 setStatus(INFORMATION, "There are new cookies in the jar."); setStatus(ERROR, "You were to slow."); setStatus(ERROR, "Stop bugging me, you were to slow."); clearStat

我有一个状态标签,它显示了一条消息,根据 当前状态。消息本身可能会有所不同(即可能有多个消息) 发送至
错误
)的消息,但
清除
状态不同,因为它不应该 显示任何消息

示例用法

setStatus(INFORMATION, "There are new cookies in the jar.");
setStatus(ERROR, "You were to slow.");
setStatus(ERROR, "Stop bugging me, you were to slow.");
clearStatus();
如何对这种异常状态建模
清除
?我应该把它从服务器上删除吗
列举?由于
CLEAR
是有效的 要处于的状态,但不显示消息。然而,客户可以打电话:

setStatus(CLEAR, "ups, I gave you a message");
还有哪些其他选项可以对除一个以外的所有值都是相同的值的列表进行建模 平等性

public class StatusLabel {
    public enum Status {
        CLEAR,
        INFORMATION,
        ERROR;
    }

    Status status = Status.CLEAR;

    public void setStatus(final Status status, final String message) {
        assert status != STATUS.CLEAR;
        // set status and a show message
        this.status = status;
    }

    public void clearStatus() {
        // clear message
        status = Status.CLEAR;
    }

    public Status getStatus() {
        return status;
    }
}

我会在状态枚举“displaysMessage”中放置一个属性。然后,您只需询问状态枚举是否应该显示消息。

我会在状态枚举“displaysMessage”上放置一个属性。然后,您可以询问状态枚举是否应该显示消息。

尽管我认为像
NONE
或甚至
null
这样的特殊值绝对可以,但对枚举值的不同行为进行建模并没有问题。你必须考虑,这些值中的每一个都可以有它自己的类,因此它是自己独特的行为。

    public class StatusLabel {
        public enum Status {
            NONE {
                public void show(String msg) {
                    throw new IllegalArgumentException("don't show CLEAR!");
                }
            },
            INFORMATION,
            ERROR;
            public void show(String msg) {
                // do what ever needed
            }
        }

        Status status = Status.NONE;

        public void setStatus(final Status status, final String message) {
            status.show(message);
            this.status = status;
        }

        public void clearStatus() {
            // clear message
            status = Status.NONE;
        }

        public Status getStatus() {
            return status;
        }
    }

这样,枚举值的行为确实不同。

尽管我认为像
NONE
或甚至
null
这样的特殊值是绝对可以的,但对枚举值的不同行为建模并没有问题。你必须考虑,这些值中的每一个都可以有它自己的类,因此它是自己独特的行为。

    public class StatusLabel {
        public enum Status {
            NONE {
                public void show(String msg) {
                    throw new IllegalArgumentException("don't show CLEAR!");
                }
            },
            INFORMATION,
            ERROR;
            public void show(String msg) {
                // do what ever needed
            }
        }

        Status status = Status.NONE;

        public void setStatus(final Status status, final String message) {
            status.show(message);
            this.status = status;
        }

        public void clearStatus() {
            // clear message
            status = Status.NONE;
        }

        public Status getStatus() {
            return status;
        }
    }

这样,枚举值的行为就完全不同了。

我可以使用
断言或抛出异常。或者,您可以确保如果
status
CLEAR
,那么
getStatus()
总是返回
null
(丑陋,我知道)我不想要丑陋:-)。我还希望在编译时有一个解决方案(在执行时断言触发器)。不过,谢谢。在编译时,我唯一能想到的就是几个实现接口的类。接口定义了
getMessage()
<代码>信息
错误
有一个接受
字符串
的构造函数,
清除
有默认构造函数。我可以使用
断言
或引发异常。或者,您可以确保如果
status
CLEAR
,那么
getStatus()
总是返回
null
(丑陋,我知道)我不想要丑陋:-)。我还希望在编译时有一个解决方案(在执行时断言触发器)。不过,谢谢。在编译时,我唯一能想到的就是几个实现接口的类。接口定义了
getMessage()
<代码>信息
错误
有一个接受
字符串
的构造函数,
清除
有默认构造函数。但是不同的消息不能以相同的状态显示,即
设置状态(错误,“foo”)设置状态(错误,“条”)不可能。我从“show”中了解到的是一个同步的、无状态的操作,比如打开一个警报框并等待用户按下“OK”。您可以经常这样做,因为它是作为参数提供的,并且没有保存,所以您的用户每次都可以使用不同的消息来访问它。事实上,它根本无法保存在枚举中。那么,您的问题到底是什么呢?但是不同的消息不能以相同的状态显示,即
setStatus(错误,“foo”)设置状态(错误,“条”)不可能。我从“show”中了解到的是一个同步的、无状态的操作,比如打开一个警报框并等待用户按下“OK”。您可以经常这样做,因为它是作为参数提供的,并且没有保存,所以您的用户每次都可以使用不同的消息来访问它。事实上,它根本无法保存在枚举中。那么,你到底有什么问题?