存储以后要使用的原始枚举常量值的解决方法?

时间:2014-05-24 16:16:24

标签: java object reference enums

例如,我有一个枚举

public enum DistanceUnits
{
    METER, KILOMETER, MILE;
}

我有一个全局引用类型DistanceUnits distanceUnit;。在某个时间点,它被设置为一些常数值,如distanceUnit = DistanceUnits.METER。现在,如果我想暂时和全局工作,并使用另一个常量值distanceUnit = DistanceUnits.KILOMETER。但是在临时过程之后,我想回到原始值distanceUnit = DistanceUnits.METER。如何存储distanceUnit = DistanceUnits.METER以便可以再次恢复它。

我知道这是由于处理引用类型的java语言规则造成的。那么这个问题是否有解决方法?

另一个问题:
- 如果此问题有可能的解决方法。它也适用于java对象吗?
- 如果有可能的java对象解决方法但不适用于枚举,那么共享它吗?

1 个答案:

答案 0 :(得分:0)

正如@SotiriosDelimanolis所说,堆栈可能是处理此问题的好方法。它看起来像这样:

class SomeClass {
    private static final LinkedList<DistanceUnit> stack = new LinkedList<>();
    static DistanceUnit distanceUnit = DistanceUnit.METER;

    static void pushAndSetUnit(DistanceUnit newUnit) {
        stack.push(distanceUnit);
        distanceUnit = newUnit;
    }

    static void popUnit() {
        distanceUnit = stack.pop();
    }
}

您的&#34;临时流程&#34;看起来像这样:

pushAndSetUnit(...);
try {
    ...
} finally {
    popUnit();
}

try-finally确保调用pop,即使进程抛出异常也是如此。您可以在其他临时进程中调用临时进程,因为堆栈是无限制的。

在我看来,就像一个严重的代码味道,取决于这个可变的全局行为设置。它非常笨重。如果您可以为需要它的每个类提供不同的DistanceUnit值,而不是调整单个全局变量,那么您会好得多。

  

我知道这是由于处理引用类型的java语言规则所致。

不,不是。它与枚举或引用类型完全无关。对于任何类型的变量,这都同样有效。