2014-07-18 4 views
0

많은 유형 (사람, 고양이, 의자 등)의 많은 목록을 처리하는 프로그램이 있습니다.일반 목록에 새 인스턴스를 추가하는 방법은 무엇입니까?

다음 코드는 코드에 여러 번 나타납니다. 이 코드는 목록에 주어진 인스턴스 수가있을 때까지 Cat 유형의 인스턴스로 주어진 목록을 채 웁니다.

int howMany = max - cats.size(); 
for(int i = 0; i < howMany; ++i) { 
cats.add(new Cat()); 
} 

이 코드는 여러 번 표시되므로 대체 할 메소드를 만들고 싶습니다. 이 메소드는 인스턴스를 추가하려는 List과 인스턴스 번호 max을 허용합니다. 필요한 경우 더 많은 매개 변수를 사용할 수 있습니다.

이것은 처음에는 간단 해 보이지만 유형 삭제 때문에 new T()을 쓸 수 없다는 것을 기억했습니다.

이것을 달성하기위한 다른 방법은 무엇입니까?

+0

cats 목록을 선언 할 때 사용한 generic 형식을 사용하십시오. generics가 사용되지 않으면 Object 클래스를 사용하십시오. –

답변

4

T 주어진 유형의 클래스를 인스턴스화하는 메소드를 다시 사용할 수 있습니다.

public T getInstanceOfT(Class<T> aClass) { 
    return aClass.newInstance(); 
} 

그런 다음 유형 T 주어진 List<T>n와 개체를 채우는 방법을 구현할 수 있습니다.

public <T> void populateList(List<T> list, Class<T> clazz, int n) { 
    for (int i = 0; i < n; i++) { 
     list.add(getInstanceOfT(clazz)); 
    } 
} 

: 당신은 IllegalAccessExceptionInstatiationException를 처리 할 수 ​​있습니다.

주 2 : getInstanceOfT()을 사용하지 않으려면 목록에 추가 할 때 clazz.newInstance()을 사용하면됩니다. 다음과 같이

당신은 방법을 사용할 수 있습니다 :

int howMany = max - cats.size(); 
Class<Cat> catClass = Cat.class; 
List<Cat> listOfCats = new ArrayList<Cat>(); 
populateList(listOfCats, Cats.class, howMany); 

상세 정보 :

+2

어쨌든 반향을 사용하는 경우 보조 방법은 무의미합니다. 그냥'list.add (clazz.newInstance());' – blgt

+0

음 ... 네, 좋은 지적입니다, 나는 그것을 편집 할 것입니다. 감사 –

0

대신 당신은 할 수 없었다 목록에 모든 불필요한 객체를 추가 짧은 목록을 더 오래 보이게하는 객체로 래핑 하시겠습니까?

class PaddedList<T> extends AbstractList<T> implements List<T> { 

    private final List<T> wrappedList; 
    private final int size; 
    private final T padding; 

    public PaddedList(List<T> wrap, int size, T pad) { 
     this.wrappedList = wrap; 
     this.size = size; 
     this.padding = pad; 
    } 

    @Override 
    public T get(int index) { 
     return index < wrappedList.size() ? wrappedList.get(index) : padding; 
    } 

    @Override 
    public int size() { 
     return size; 
    } 

} 

public void test() { 
    List<String> test = Arrays.asList("One", "Two"); 
    List<String> list10 = new PaddedList<>(test, 10, "Many"); 
    System.out.println(list10); 
} 

이것은 당신이 패딩으로 사용하지만이 길이를 고정처럼 목록을 보이는 당신이 원하는 모든 경우 개체를 수정하려고하면이 매우 잘못한다 분명히

[One, Two, Many, Many, Many, Many, Many, Many, Many, Many] 

를 인쇄 그러면 매우 효율적으로 작동합니다.

관련 문제