2016-08-23 3 views
1

Class 객체가 주어질 때 객체 생성에 대한 간단한 질문. 아니면 내가 다르게 이것에 관해서 갈 필요가 있습니다. 우선, 필자의 계획에서 File 객체의 배열을 취하여 각각을 Set으로 읽는 메소드를 작성했습니다.이 세트는 각 세트가 목록에 추가되고 목록이 반환됩니다. (오래는 물론 문자열이 포함로)주어진 클래스 객체 (Java)에서 객체 생성

private static List<Set<String>> loadFiles(File[] files, Class whatType, Charset charSet){ 
    List<Set<String>> setList = new ArrayList<Set<String>>(files.length); 

    try { 
     for(File f : files){ 
      BufferedInputStream bs = new BufferedInputStream(new FileInputStream(f)); 
      InputStreamReader r = new InputStreamReader(bs, charSet); 
      BufferedReader br = new BufferedReader(r); 

      Set<String> set = new HashSet<>(); //This is the problem line 
      String line = null; 

      while((line = br.readLine()) != null){ 
       set.add(line.trim()); 

      } 

      br.close(); 
      setList.add(set); 
     } 

     return setList; 
    } catch (FileNotFoundException e) { 
     //Just return the empty setlist 
     return setList; 
    } catch (IOException e) { 
     //return a new empty list 
     return new ArrayList<Set<String>>(); 
    } 
} 

을하지만 내가 원하는 것은 인스턴스화하는 설정의 유형을 지정하는 방법을 사용자에게 허용하는 것입니다 : 아래는 내가 가지고있는 것입니다. 이것이 'whatType'매개 변수의 용도입니다.

내 모든 연구는 클래스 이름이 지정된 객체를 인스턴스화하는 방법으로 안내해 주었지만 실제로는 여기에있는 것이 아닙니다. 당신은 클래스가 인수 없음의 액세스 가능한 생성자가 가정하면

+1

예 : 'HashSet' 대'TreeSet'? –

+1

왜? 일반적으로 Java에서 이와 같은 방법으로 자신 만의 새로운 세트를 반환 할 것으로 예상됩니다. 호출자의 버전을 사용해야하는 이유가 있다면 그 파일을 전달하십시오. – chrylis

+0

@chrylis 이것의 주된 이유는 내부적으로 제가 수행하고있는 프로젝트가 파일에서 많은로드를하고 그 문자열을 세트에 저장한다는 것입니다 : 해시, 트리, Set을 구현하는 우리 자신의 클래스. 사용되는 Set의 유형은 상황에 따라 다릅니다. 이렇게하면 코드 기반을 단순화하고 캐스팅을 통해 상용구를 적게 작성할 수 있습니다. 이는 기본 구현이 중요한 경우에 해당됩니다. – Hangman4358

답변

1

, 당신은 기본적으로 떨어져 newInstance() 전화 위치 :

Set<String> set = (Set<String) whatType.newInstance(); 

주 당신이 정의하는 경우 whatTypeClass<? extends Set> A와 대신 단지 원시 Class, 당신 이 추악한 캐스트도 제거 할 수 있습니다.

+0

이 프로젝트에서 Java 7을 사용하고 있기 때문에이 대답을 받아 들였고 완벽하게 작동했습니다. – Hangman4358

2

Java8을 사용할 수 있으면이 문제를 쉽게 해결할 수 있습니다.

private static List<Set<String>> loadFiles(File[] files, Supplier<Set> setSupplier, Charset charSet) 

변경 문제 라인 :

Set<String> set = setSupplier.get(); 

다음, setSupplier PARAM 쉽게 방법 참조를 사용하여 제공 할 수 있습니다이 방법에 대한 각 호출에, 다음과 같은 방법을 선언 HashSet의를 : : new, TreeSet :: new ...

+0

아직 Java 7 세계에서 멈추지 않았 음을 지정 했어야했는데 8 번의 테스트에서이 테스트는 정말 훌륭했습니다. 조롱 8 프로젝트에서 – Hangman4358

2

Class.newInstance() 메소드 사용 방법은 어떻습니까?

public <T extends Set> void myMethod(Class<T> type) { 
 
    T object; 
 
    try { 
 
    object = type.newInstance(); 
 
    } catch (InstantiationException e) { 
 
    e.printStackTrace(); 
 
    } catch (IllegalAccessException e) { 
 
    e.printStackTrace(); 
 
    } 
 
} 
 

 
public void caller() { 
 
    myMethod(HashSet.class); 
 
}

이 당신이 찾고있는 무엇인가 : 나는 당신을 위해 간단한 예를 코딩?