2016-08-23 6 views
1

Classオブジェクトが与えられたときにオブジェクトを作成することについて簡単に質問します。あるいは、私はこれについて別のことをする必要があります。最初に私の計画から、Fileオブジェクトの配列を取得し、それぞれをSetに読み込むメソッドを作成しています。そこで、各セットがリストに追加され、リストが返されます。以下は、私が持っているものです。Javaの指定されたClassオブジェクトからオブジェクトを作成する

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これの主な理由は、内部的に私が取り組んでいるプロジェクトはファイルからたくさんの読み込みを行い、それらの文字列をセットに格納することです:Hash、Tree、Setを実装する独自のクラス。使用されるセットのタイプは状況によって異なります。これにより、コードベースを簡素化し、キャストして定型文を少なく書くことができます。これは、基本となる実装が重要な場合に適しています。 – Hangman4358

答えて

1

あなたはクラスは、引数なしのアクセスコンストラクタを持っていると仮定した場合、あなたは基本的に離れてnewInstance()呼び出します:

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

注あなたは、Class<? extends Set>だけではなく、生のClassとしてwhatTypeを定義した場合ということこの醜いキャストも取り除くことができます。

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

が、これはあなたが探しているものです:私はあなたのための簡単な例をコード化されましたか?

関連する問題