Java List 구현 클래스를 제공하는 setter 만들기

Tito Zoe 채팅

이 인터페이스를 기반으로 작은 유형 변환 프레임 워크를 작성하고 있습니다.

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;
}

또한 toListImplprivate 필드를 사용하여이 줄을 어떻게 바꾸어야합니까?

//... OLD
List<To> toList = new ArrayList<>(); // DEFAULT IMPLEMENTATION
//... NEW 
List<To> toList = toListImplementation.newInstance(); // WOULD WORK???

편집 : Java 8은 매우 멋지다. 훌륭한 기능이 있다는 것을 알고있다. 나는 여전히 자바 7에서 일하고 있으며 자바 5 준수를 달성하고 싶습니다.

Jesper

클래스 사용자 가 필요한 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Observable 기본 setter 동작을 구현하는 Nativescript 클래스

분류에서Dev

Java의 동일한 클래스에서 다른 setter를 사용하여 setter에 값을 제공하는 방법

분류에서Dev

Java 라이브러리를 만들 때 클래스를 구성하는 방법

분류에서Dev

클래스를 확장하고 인터페이스를 구현하는 일반 Java 클래스를 만드는 방법은 무엇입니까?

분류에서Dev

Java 다형성에서 인터페이스를 구현하는 모든 클래스를 해당 유형 인터페이스로 만들 수 있습니까?

분류에서Dev

Java-ActionListener를 구현하는 내부 클래스의 기호를 찾을 수 없습니다.

분류에서Dev

Java 웹을 만들 때 서버에 넣은 클래스에 대해 Serializable을 구현해야하는 이유

분류에서Dev

Java Comparable <T> 클래스 구현 문제

분류에서Dev

제네릭으로 구현하는 Java 추상 클래스

분류에서Dev

목록보기를 확장하는 클래스 구현

분류에서Dev

목록보기를 확장하는 클래스 구현

분류에서Dev

목록 인터페이스를 제공하는 클래스 만들기

분류에서Dev

OOP : 3 차원 기하학적 형태를 표현하는 클래스 구현

분류에서Dev

setter 사용 빈도가 getter보다 높은 setter 및 getter 함수로 스레드 안전 클래스를 구현하는 방법

분류에서Dev

java 제네릭-HashSet <T>를 취하는 클래스를 구현하는 방법은 무엇입니까?

분류에서Dev

런타임에 제공된 종속성을 기반으로 Java 클래스 구현을 동적으로 작성

분류에서Dev

Java에서 구체적인 클래스를 구현 하시겠습니까?

분류에서Dev

기본 클래스 구조체에서 하위 클래스 만들기

분류에서Dev

Java 클래스는 Runnable을 구현하고 새 스레드를 만든 다음 이상한 결과를 반환합니다. 왜?

분류에서Dev

자바는 모든 서브 클래스 멤버를 설정하는 기본 슈퍼 클래스를 구현

분류에서Dev

0 % 정확도를 제공하는 기능 열 구현

분류에서Dev

인터페이스를 구현하는 클래스 이름 가져 오기

분류에서Dev

Java로 하위 하위 클래스 만들기

분류에서Dev

클래스를 구현하는 방법?

분류에서Dev

클래스를 다른 클래스 딜레마의 친구로 만들기위한 B / B + Tree 구현

분류에서Dev

Java 클래스 구현

분류에서Dev

스레드없이 Runnable을 구현하는 Java 클래스

분류에서Dev

Android의 onCreate ()에서 사용하기 위해 사용자 정의 클래스 객체로 lateinit를 올바르게 구현하는 방법은 '속성 getter 또는 setter 예상'오류를 방지합니다.

분류에서Dev

자식 생성자를 구현하지 않고 Perl 하위 클래스를 만들 수 있습니까?

Related 관련 기사

  1. 1

    Observable 기본 setter 동작을 구현하는 Nativescript 클래스

  2. 2

    Java의 동일한 클래스에서 다른 setter를 사용하여 setter에 값을 제공하는 방법

  3. 3

    Java 라이브러리를 만들 때 클래스를 구성하는 방법

  4. 4

    클래스를 확장하고 인터페이스를 구현하는 일반 Java 클래스를 만드는 방법은 무엇입니까?

  5. 5

    Java 다형성에서 인터페이스를 구현하는 모든 클래스를 해당 유형 인터페이스로 만들 수 있습니까?

  6. 6

    Java-ActionListener를 구현하는 내부 클래스의 기호를 찾을 수 없습니다.

  7. 7

    Java 웹을 만들 때 서버에 넣은 클래스에 대해 Serializable을 구현해야하는 이유

  8. 8

    Java Comparable <T> 클래스 구현 문제

  9. 9

    제네릭으로 구현하는 Java 추상 클래스

  10. 10

    목록보기를 확장하는 클래스 구현

  11. 11

    목록보기를 확장하는 클래스 구현

  12. 12

    목록 인터페이스를 제공하는 클래스 만들기

  13. 13

    OOP : 3 차원 기하학적 형태를 표현하는 클래스 구현

  14. 14

    setter 사용 빈도가 getter보다 높은 setter 및 getter 함수로 스레드 안전 클래스를 구현하는 방법

  15. 15

    java 제네릭-HashSet <T>를 취하는 클래스를 구현하는 방법은 무엇입니까?

  16. 16

    런타임에 제공된 종속성을 기반으로 Java 클래스 구현을 동적으로 작성

  17. 17

    Java에서 구체적인 클래스를 구현 하시겠습니까?

  18. 18

    기본 클래스 구조체에서 하위 클래스 만들기

  19. 19

    Java 클래스는 Runnable을 구현하고 새 스레드를 만든 다음 이상한 결과를 반환합니다. 왜?

  20. 20

    자바는 모든 서브 클래스 멤버를 설정하는 기본 슈퍼 클래스를 구현

  21. 21

    0 % 정확도를 제공하는 기능 열 구현

  22. 22

    인터페이스를 구현하는 클래스 이름 가져 오기

  23. 23

    Java로 하위 하위 클래스 만들기

  24. 24

    클래스를 구현하는 방법?

  25. 25

    클래스를 다른 클래스 딜레마의 친구로 만들기위한 B / B + Tree 구현

  26. 26

    Java 클래스 구현

  27. 27

    스레드없이 Runnable을 구현하는 Java 클래스

  28. 28

    Android의 onCreate ()에서 사용하기 위해 사용자 정의 클래스 객체로 lateinit를 올바르게 구현하는 방법은 '속성 getter 또는 setter 예상'오류를 방지합니다.

  29. 29

    자식 생성자를 구현하지 않고 Perl 하위 클래스를 만들 수 있습니까?

뜨겁다태그

보관