이 인터페이스를 기반으로 작은 유형 변환 프레임 워크를 작성하고 있습니다.
public interface Converter <From,To> {
public To convert(final From from);
}
따라서 다음과 같은 사용자 지정 형식 변환기를 작성할 수 있습니다.
public class BigDecimal2Double implements Converter<BigDecimal, Double> {
@Override
public Double convert(final BigDecimal value) {
return value != null ? value.doubleValue() : null;
}
}
다음 클래스는 데이터 목록을 처리하기 위해 변환기의 기능을 확장하기위한 것입니다.
public abstract class ListConverter<From,To> implements Converter<From,To> {
public List<To> convertList(List<From> fromList){
if (fromList == null) {return null;}
List<To> toList = new ArrayList<>(); // DEFAULT IMPLEMENTATION
for(From from: fromList ){
toList.add(this.convert(from));
}
return toList;
}
public static <From,To> ListConverter<From, To> extend(final Converter<From, To> converter){
return new ListConverter<From, To>() {
@Override
public To convert(From from) {
return converter.convert(from);
}
};
}
}
따라서 다음과 같은 클라이언트 코드를 작성할 수 있습니다.
ListConverter<BigDecimal,Double> lcb2d = ListConverter.extend(new BigDecimal2Double());
List<BigDecimal> bdList = retrieveSomeBigDecList();
List<Double> convertedList = lcb2d.convertList(bdList);
보시다시피 이것은 ArrayList
변환 된 목록에 대한 기본 구현 만 제공 할 수 있습니다 .
List
클라이언트 코드와 다른 구현 을 제공하는 기능을 추가하고 싶습니다 . 예 :
ListConverter<BigDecimal,Double> lcb2d = ListConverter.extend(new BigDecimal2Double());
List<BigDecimal> bdList = retrieveSomeBigDecList();
lcbd.setToListImplementation(LinkedList.class); // How to define such a method?
List<Double> convertedList = lcb2d.convertList(bdList); // would be a LinkedList
어떻게 할 수 있습니까? ListConverter
클래스 내부의 다음 코드 는 컴파일되지 않습니다.
private Class<? extends List<To>> toListImplementation = ArrayList.class;
public void setToListImplementation(Class<? extends List<To>> listImpl){
toListImplementation = listImpl;
}
또한 toListImpl
private 필드를 사용하여이 줄을 어떻게 바꾸어야합니까?
//... OLD
List<To> toList = new ArrayList<>(); // DEFAULT IMPLEMENTATION
//... NEW
List<To> toList = toListImplementation.newInstance(); // WOULD WORK???
편집 : Java 8은 매우 멋지다. 훌륭한 기능이 있다는 것을 알고있다. 나는 여전히 자바 7에서 일하고 있으며 자바 5 준수를 달성하고 싶습니다.
클래스 사용자 가 필요한 ListConverter
특정 종류를 생성하기 위해 팩토리 메서드를 제공 할 수있는 방법을 제공 List
합니다. 예:
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
public abstract class ListConverter<From, To> implements Converter<From, To> {
private final Supplier<List<To>> listFactory;
public ListConverter(Supplier<List<To>> listFactory) {
this.listFactory = listFactory;
}
public List<To> convertList(List<From> fromList) {
if (fromList == null) {
return null;
}
List<To> toList = listFactory.get();
for (From from : fromList) {
toList.add(this.convert(from));
}
return toList;
}
public static <From, To> ListConverter<From, To> extend(Converter<From, To> converter, Supplier<List<To>> listFactory) {
return new ListConverter<From, To>(listFactory) {
@Override
public To convert(From from) {
return converter.convert(from);
}
};
}
public static <From, To> ListConverter<From, To> extend(Converter<From, To> converter) {
return extend(converter, ArrayList::new);
}
}
예를 들어 원하는 경우 LinkedList
다음을 수행 할 수 있습니다.
ListConverter<BigDecimal,Double> lcb2d =
ListConverter.extend(new BigDecimal2Double(), LinkedList::new);
편집 -Java 5-7의 경우 ListFactory
인터페이스를 만들 수 있습니다 .
import java.util.List;
public interface ListFactory<T> {
List<T> newList();
}
그런 다음이를 사용하고 Java 8 메서드 참조 대신 익명 내부 클래스를 사용합니다.
import java.util.ArrayList;
import java.util.List;
public abstract class ListConverter<From, To> implements Converter<From, To> {
private final ListFactory<To> listFactory;
public ListConverter(ListFactory<To> listFactory) {
this.listFactory = listFactory;
}
public List<To> convertList(List<From> fromList) {
if (fromList == null) {
return null;
}
List<To> toList = listFactory.newList();
for (From from : fromList) {
toList.add(this.convert(from));
}
return toList;
}
public static <From, To> ListConverter<From, To> extend(Converter<From, To> converter, ListFactory<To> listFactory) {
return new ListConverter<From, To>(listFactory) {
@Override
public To convert(From from) {
return converter.convert(from);
}
};
}
public static <From, To> ListConverter<From, To> extend(Converter<From, To> converter) {
return extend(converter, new ListFactory<To>() {
@Override
public List<To> newList() {
return new ArrayList<To>();
}
});
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다