1

非常によく似たいくつかのクラス (FloatOperand、BooleanOperand、IntegerOperand) があります。呼び出される「解析」メソッド (parseFloat、parseBoolean など) のみが異なります。この xxOperand クラスを 1 つの GenericOperand クラスだけに置き換えることはできますか? (ジェネリック/リフレクションの組み合わせによるものかもしれません)。

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();
}
4

2 に答える 2

2

ここのようなさまざまなアルゴリズムを実際に使用していFloat.parseFloatます。したがって、これらの数行からわかるように、個別のクラスは問題ないようです。

于 2012-04-30T19:45:34.827 に答える
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);
  }
}
于 2012-05-03T12:34:03.157 に答える