确保一个值只设置一次的正确方法是什么,尽管它的设置时间是未知的(即:不在构造函数中)。我可以进行空检查或跟踪标志并抛出异常 - 但我应该抛出什么异常?这是一个小型的本地化库,我不想为这种看似通用的情况创建自己的 ValueAlreadyAssigned 异常。
问问题
190 次
3 回答
8
在二传手。像这样做:
private foo bar;
public void setFoo(foo bar) {
if (this.bar == null) {
this.bar = bar;
} else {
System.out.println("Don't touch me!");
// J/K Throw an IllegalStateException as Michal Borek said in his answer.
}
}
于 2013-05-08T13:10:42.977 回答
4
该方法可以 throw IllegalStateException
,因为它的 javadocs 说:
表示方法已在非法不适当的时间被调用。
于 2013-05-08T13:09:59.113 回答
1
恕我直言,您自己的异常定义没什么大不了的,特别是如果它扩展了RuntimeException
。所以我建议你定义ValueAlreadySetException extends IllegalStateException
和使用它。
下一点是您必须根据@Renan 的建议复制的每个设置器的逻辑。我建议你以下。定义特殊的通用容器并使用它:
public class SetOnceContainer<T> {
private Class<T> type;
private String name;
private T value;
private boolean set = false;
public SetOnceContainer(Class<T> type, String name) {
this.type = type;
this.name = name;
}
public void set(T value) {
if (set) {
throw new ValueAlreadySetException(name);
}
this.value = value;
this.set = true;
}
public T get() {
return value;
}
}
请注意,此实现null
也支持值。
现在您可以按如下方式使用它:
public MyClass {
private SetOnceContainer<Integer> number = new SetOnceContainer<Integer>(Integer.class, "number");
private SetOnceContainer<String> text = new SetOnceContainer<String>(String.class, "text");
public void setNumber(int value) {
number.set(value);
}
public void setText(String value) {
text.set(value);
}
public Integer getNumber() {
return number.get();
}
public String getText() {
text.get();
}
}
该实现被封装到一个点中。如果需要,您可以一次更改它。也支持空值。setter 和 getter 只是比普通的稍微复杂一点。
于 2013-05-08T13:27:53.640 回答