2011-01-09 2 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 가지 방법은 매우 유사하므로 유사한 작업을 수행하고 실제 작업을 적합한 클래스에 위임하기위한 템플릿을 만들고 싶습니다. 그러나 템플릿을 변경하지 않고이 프레임 작업을 쉽게 확장하려고합니다. 그래서 예를 들면 :자바 템플릿 디자인

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에 대해 사용하는 "generic"클래스를 갖도록 지정할 수 있습니다. 그런 다음 확장 프로그램은 사용중인 클래스 유형을 각각 지정합니다. (이 무시되지 않도록이 템플릿을 유지하려는 경우)과 별도의 클래스의 각 유형에 대한 변환기 구현을 변환 방법은 최종 만들