优化代码的建议

时间:2011-09-30 15:38:22

标签: java

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

ValueIteminterface,由ListValueImplMapValueImpl等实现。我希望返回值为object。代码工作正常但我想知道这是否可以以任何方式改进?

3 个答案:

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