我需要在生产环境中隐藏一些菜单选项,但不要在开发中隐藏。
我将此实现为这样的枚举:
public enum Functionality {
FUNCTION_1(true),
FUNCTION_2,
FUNCTION_3(true);
private boolean usable;
Functionality() {
this(false);
}
Functionality(boolean usable) {
this.usable = usable;
}
public boolean isUsable() {
return usable;
}
}
然后,当我需要显示菜单选项时,我会检查是否需要显示该功能。
所以我需要能够在环境开发时更改可用的布尔值。但我在春天找不到任何办法。
你知道怎么做这样的事吗?
答案 0 :(得分:2)
你可以更改enum
的字段,但它通常被认为是一个坏主意,通常是一种设计气味。
更好的方法可能是不要将usable
作为一个字段,而是将其作为计算属性:
public enum Functionality {
FUNCTION_1(true),
FUNCTION_2,
FUNCTION_3(true);
private final boolean restricted;
Functionality() {
this(false);
}
Functionality(boolean restricted) {
this.restricted = restricted;
}
public boolean isRestricted() {
return restricted;
}
public boolean isUsable() {
if (!restricted) {
return true;
} else {
return SystemConfiguration.isDevelopmentSystem();
}
}
}
显然需要像SystemConfiguration.isDevelopmentSystem()
这样的方法来实现这一点。
在我实施的某些系统中,我使用了另一个enum
:
public enum SystemType {
PRODUCTION,
TESTING,
DEVELOPMENT;
public final SystemType CURRENT;
static {
String type = System.getEnv("system.type");
if ("PROD".equals(type)) {
CURRENT = PRODUCTION;
} else if ("TEST".equals(type)) {
CURRENT = TESTING;
} else {
CURRENT = DEVELOPMENT;
}
}
}
这里我使用系统属性在运行时指定类型,但任何其他配置类型可能都是合适的。
答案 1 :(得分:0)
枚举本质上是常量。使用true
到FUNCTION_1
和FUNCTION_3
的硬编码,Spring无法注入任何内容。
答案 2 :(得分:-1)
java枚举是单例和不可变的,所以我认为你无论如何都不能改变枚举状态。