2011-01-09 8 views
3
public class Converter 
{ 
    private Logger logger = Logger.getLogger(Converter.class); 
    public String convert(String s){ 
     if (s == null) throw new IllegalArgumentException("input can't be null"); 
     logger.debug("Input = " + s); 
     String r = s + "abc"; 
     logger.debug("Output = " + s); 
     return r; 
    } 

    public Integer convert(Integer s){ 
     if (s == null) throw new IllegalArgumentException("input can't be null"); 
     logger.debug("Input = " + s); 
     Integer r = s + 10; 
     logger.debug("Output = " + s); 
     return r; 
    } 
} 

上記の2つのメソッドは非常に似ているので、私は同様のことを行い、実際の作業をクラスに委譲するテンプレートを作成します。しかし、テンプレートを変更せずにこのフレームワークを簡単に拡張したいと思っています。 したがって、たとえば:javaテンプレートデザイン

public class ConverterTemplate 
{ 
    private Logger logger = Logger.getLogger(Converter.class); 
    public Object convert(Object s){ 
     if (s == null) throw new IllegalArgumentException("input can't be null"); 
     logger.debug("Input = " + s); 
     Object r = doConverter(); 
     logger.debug("Output = " + s); 
     return r; 
    } 

    protected abstract Object doConverter(Object arg); 
} 

public class MyConverter extends ConverterTemplate 
{ 
    protected String doConverter(String str) 
    { 
     String r = str + "abc"; 
     return r; 
    } 

    protected Integer doConverter(Integer arg) 
    { 
     Integer r = arg + 10; 
     return r; 
    } 
} 

しかし、それは動作しません。誰かが私にそれをするよりよい方法を提案することができますか?私は2つの目標を達成したい: 1.拡張可能で、すべての同様の仕事をするテンプレート。 2.拡張クラスの数を最小限に抑えます。

ありがとう、

+2

([ジェネリック]を見てみましょうhttp://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf)。 –

答えて

5

使用ジェネリック、変換方法は、最終的にする(このテンプレートを保存しておきたいときにそれが上書きされていない)と別のクラスに各タイプのコンバータの実装を行います。

public interface Converter<T> { 

    public T convert(T s); 
} 


public abstract class AbstractConverter<T> implements Converter<T> { 

    @Override 
    public final T convert(T s) { 
     if (s == null) throw new IllegalArgumentException("input can't be null"); 
     //logger.debug("Input = " + s); 
     T r = doConverter(s); 
     //logger.debug("Output = " + s); 
     return r; 
    } 

    public abstract T doConverter(T s); 
} 


public class StringConverter extends AbstractConverter<String> { 

    public String doConverter(String s) { 
     String r = s + "abc"; 
     return r; 
    }; 
} 

public class IntegerConverter extends AbstractConverter<Integer> { 

    public Integer doConverter(Integer s) { 
     Integer r = s + 10; 
     return r; 
    }; 
} 
+1

このインターフェースは、Function、http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Function.htmlと同等です。これには、関数、http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Functions.htmlにも便利なユーティリティメソッドがあります。 – sjr

1

これはジェネリックを使用するのに最適なケースです。具体的には、親クラスがdoConvertで使用する「汎用」クラスを持つように指定できます。拡張機能はそれぞれ、使用しているクラスのタイプを指定します。

関連する問題