例如,我有一个枚举
public enum DistanceUnits
{
METER, KILOMETER, MILE;
}
我有一个全局引用类型DistanceUnits distanceUnit;
。在某个时间点,它被设置为一些常数值,如distanceUnit = DistanceUnits.METER
。现在,如果我想暂时和全局工作,并使用另一个常量值distanceUnit = DistanceUnits.KILOMETER
。但是在临时过程之后,我想回到原始值distanceUnit = DistanceUnits.METER
。如何存储distanceUnit = DistanceUnits.METER
以便可以再次恢复它。
我知道这是由于处理引用类型的java语言规则造成的。那么这个问题是否有解决方法?
另一个问题:
- 如果此问题有可能的解决方法。它也适用于java对象吗?
- 如果有可能的java对象解决方法但不适用于枚举,那么共享它吗?
答案 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语言规则所致。
不,不是。它与枚举或引用类型完全无关。对于任何类型的变量,这都同样有效。