2012-04-30 59 views
1

我有幾個類(FloatOperand,BooleanOperand,IntegerOperand),它們非常相似。它們只在被調用的「parse」方法(parseFloat,parseBoolean等)方面有所不同 - 我可以用一個GenericOperand類來替換這個xxOperand類嗎? (也許通過泛型/反射組合)。泛化不同的實現通過使用泛型

public class FloatOperand implements ConditionOperand { 
Float parsedNumber = 0.0f; 
public FloatOperand parse(String aString) { 
if(!StringUtils.isEmpty(aString)) { 
    parsedNumber = Float.parseFloat(aString); 
} 
return this; 
} 

public int compareTo(ConditionOperand arg) { 
    Float someArg = (Float) arg.getWrappedToken(); 
    return parsedNumber.compareTo(someArg); 
} 

public Float getWrappedToken() { 
    return this.parsedNumber; 
} 

/************/ 
public interface ConditionOperand extends Comparable<ConditionOperand> { 
/** 
* @param aString 
*   - String representing a number, or a date, or a string. 
*/ 
ConditionOperand parse(String aString); 
Object getWrappedToken(); 
} 
+0

試圖將這些與反射相結合將花費大量的速度開銷。這幾乎肯定不值得。 –

回答

0

由於Float.parseFloat()的調用,無法以通用方式進行調用,因此無法用泛型替換此類。

但是你可以通過使用抽象類(而不是接口或除接口)與仿製藥,以避免增加一倍的代碼,例如避免雙重代碼:

public class ConditionOperand<T extends Comparable<?>> implements Comparable<ConditionOperand<T>> { 
    T parsedNumber; 
    public ConditionOperand<T> parse(String aString) { 
    if(!StringUtils.isEmpty(aString)) { 
     parsedNumber = simpleParse(aString); 
    } 
    return this; 
    } 

    public int compareTo(ConditionOperand arg) { 
    T someArg = arg.getWrappedToken(); 
    return parsedNumber.compareTo(someArg); 
    } 

    public T getWrappedToken() { 
    return this.parsedNumber; 
    } 

    public abstract T simpleParse(String s); 
} 

然後你有一些非常簡單的實現子類如

public class FloatOperand implements ConditionOperand<Float> { 
    public Float simpleParse(String s) { 
    return Float.parseFloat(s); 
    } 
} 
+0

太棒了!這就是我想要的。此外,我發現類ConditionOperand的正確語法是下限,否則它將不會編譯: 'public abstract class ConditionOperand > implements Comparable >'' – misterzigzag

2

你真的在使用不同的算法,如Float.parseFloat在這裏。所以從我從這幾行看到的情況看,單獨的課程似乎沒問題。

+0

謝謝。我會保持原樣。 – misterzigzag