2012-04-30 10 views
1

非常に似ているいくつかのクラス(FloatOperand、BooleanOperand、IntegerOperand)があります。それらは(parseFloat、parseBooleanなど)呼び出される "解析"メソッドでのみ異なります。 - このxxOperandクラスを1つのGenericOperandクラスで置き換えることはできますか? (多分Generics/Reflectionの組み合わせで)。ジェネリックスを使用して異なる実装を一般化する

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()の呼び出しのため、これを汎用クラスの1つのクラスに置き換えることはできません。これは一般的な方法ではできません。

しかし、あなたは、たとえば、二倍のコードを避けるために、ジェネリックで(代わりに、インターフェースのまたはインタフェースに加えて)抽象クラスを使用して、二重のコードを避けることができます。

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 >はComparable を実装しています。 – misterzigzag

2

ここではFloat.parseFloatなどの異なるアルゴリズムを使用しています。だから、私はこれらの数行から見ると、別々のクラスは大丈夫と思われる。

+0

ありがとうございます。私はそれをそのまま残します。 – misterzigzag

関連する問題