public Object getValue()
{
ValueItem valueItem = null;
Object returnValue = null;
if(this.value instanceof StringValueImpl)
{
valueItem = (StringValueImpl) this.value;
}
else if(this.value instanceof ListValueImpl)
{
valueItem = (ListValueImpl) this.value;
}
else if(this.value instanceof MapValueImpl)
{
valueItem = (MapValueImpl) this.value;
}
if(valueItem!=null)
returnValue = valueItem.getValue();
return returnValue;
}
ValueItem
是interface
,由ListValueImpl
,MapValueImpl
等实现。我希望返回值为object
。代码工作正常但我想知道这是否可以以任何方式改进?
答案 0 :(得分:6)
this.value
的类型是什么?如果它是ValueItem
,那么您不需要执行任何操作,并且可以用以下方法替换该方法:
public Object getValue()
{
Object returnValue = null;
if(this.value!=null)
returnValue = this.value.getValue();
return returnValue;
}
甚至更短:
public Object getValue()
{
return this.value!=null ? this.value.getValue() : null;
}
如果this.value
不类型为ValueItem
但,则必须包含ValueItem
,那么你手头有设计问题。
答案 1 :(得分:1)
我倾向于你的getValue()
根本没有为你做任何事情。你正在检测它是什么类,将它投射到该类,然后再将它推入一个对象。 ...所以你必须在getValue()
的呼叫方那边做同样的检测!
就个人而言,我会这样做:
public boolean isaStringValueImpl() {
return (this.value instanceof StringValueImpl);
}
public boolean isaListValueImpl() {
return (this.value instanceof ListValueImpl);
}
public boolean isaMapValueImpl() {
return (this.value instanceof MapValueImpl);
}
public StringValueImpl getAsaStringValueImpl() {
return (StringValueImpl)this.value;
}
public ListValueImpl getAsaListValueImpl() {
return (ListValueImpl)this.value;
}
public MapValueImpl getAsaMapValueImpl() {
return (MapValueImpl)this.value;
}
除常规吸气剂外:
public ValueItem getValueItem() {
return this.value;
}
但即使有了这一切,我也会说你可能有更大的设计问题可以清理。
答案 2 :(得分:0)
基于通用的类型安全版本如何。
public abstract class ValueItem<T> {
public abstract T getValue();
public class StringValueImpl extends ValueItem<String> {
private String value;
public String getValue() {
return value;
}
}
public class ListValueImpl extends ValueItem<List<?>> {
private List<?> value;
public List<?> getValue() {
return value;
}
}
public class MapValueImpl extends ValueItem<Map<?, ?>> {
private Map<?, ?> value;
public Map<?, ?> getValue() {
return value;
}
}
}