如何使用Spring更改枚举的属性?

时间:2011-05-11 08:50:43

标签: java spring

我需要在生产环境中隐藏一些菜单选项,但不要在开发中隐藏。

我将此实现为这样的枚举:

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

然后,当我需要显示菜单选项时,我会检查是否需要显示该功能。

所以我需要能够在环境开发时更改可用的布尔值。但我在春天找不到任何办法。

你知道怎么做这样的事吗?

3 个答案:

答案 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)

枚举本质上是常量。使用trueFUNCTION_1FUNCTION_3的硬编码,Spring无法注入任何内容。

这是一个副本: Using Spring IoC to set up enum values

答案 2 :(得分:-1)

java枚举是单例和不可变的,所以我认为你无论如何都不能改变枚举状态。