2012-04-30 3 views
1

У меня есть несколько класов (FloatOperand, BooleanOperand, IntegerOperand), которые очень похожи. Они отличаются только тем, что вызывается метод parse (parseFloat, parseBoolean и т. Д.). Мог ли я заменить эти классы xxOperand только одним классом GenericOperand? (возможно, комбинацией Generics/Reflection).Обобщение различных реализаций с помощью Generics

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 > реализует Comparable >' – misterzigzag

2

Вы действительно используете различные алгоритмы, такие как Float.parseFloat здесь. Поэтому из того, что я вижу из этих нескольких строк, отдельные классы кажутся ок.

+0

Спасибо. Я оставлю это как есть. – misterzigzag

Смежные вопросы