2017-11-06 5 views
0

ファイルシステムへの読み書きを行うインタフェースを持っています。私は上記のコードはOperations<User>だけでなく、両方のOperations<List<User>>のために働く必要がありJavaジェネリック型がTとTのリストを受け入れることを許可する

import java.io.IOException; 
import java.util.List; 

public interface Operations<T> { 

    void save(T serializableObject) throws IOException; 
    List<T> get() throws IOException; 

} 

このインタフェースの両方のリストにケータリングだけでなく、T.を作る方法を今疑問があります。私はメソッドをオーバーロードしている場合は

私は重複したコードにあなたはvarargsの使用を作ることができT

void save(T serializableObject) throws IOException; 
void save(Collection<T> listOfTs); 
+2

番号タイプは「aまたはb」にすることはできません。あなたがそれについて考えているなら、あなたはその理由を理解するでしょう:どのタイプがあなたにあるかを知ることはできません。 'List 'を試してみて、発信者に単一項目のサイズ1のリストを作るよう要求することができます。 – Bohemian

+0

質問が不明です。リストを満たす方法と、Tを満たす方法の1つがあります。詳細は何ですか。リスト内のすべてのTを処理し、それぞれに対してsave(T ...)メソッドを呼び出すデフォルト実装を追加することができます(リスト ...)。 ) –

答えて

3

Addメソッドを持っているつもりです。この方法は、次のようになります。obj.save(myArgument)

  • 複数のカンマ区切りの引数:obj.save(myFirstArgument, mySecondArgument)
  • 配列:obj.save(new MyArgumentType[]{myFirstArgument, mySecondArgument})
  • その後、

    • 1引数で呼び出すことができます

      void save(T... objects) throws IOException; 
      

    +0

    Java 8を使用している場合、 'Collection'メソッドの' default'実装を追加してください。 – daniu

    +0

    私はすでに私の考えでこの考えを持っていました。しかし、これはコードの複製を作成します。実装の詳細を追加して質問を確認してください。 – dataEnthusiast

    +0

    @dataEnthusiastなぜですか?私はいつもコレクションを書くことができ、1つの要素を書くことは、1つの要素のコレクションの特殊なケースであると仮定します。コードはここで問題なくDRYされました。 – Antoniossss

    0

    のコレクションを受け入れる

    @Override 
        public void saveCollection(List<T> serializableObjects) throws IOException { 
         String jsonData = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(serializableObjects); 
         BufferedWriter br = new BufferedWriter(new FileWriter(file)); 
         br.write(jsonData); 
         br.close();  
        } 
    
        @Override 
        public void save(T serializableObject) throws IOException { 
         String jsonData = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(serializableObject); 
         BufferedWriter br = new BufferedWriter(new FileWriter(file)); 
         br.write(jsonData); 
         br.close(); 
        } 
    
    1

    コードの重複が懸念される場合は、単に共通の実装を別のプライベートメソッドに置き、既存のオーバーロードを使用してそれらの引数をそのプライベートメソッドに転送します。

    private void saveImpl(Object serializableObject) throws IOException { 
        String jsonData = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(serializableObject); 
        BufferedWriter br = new BufferedWriter(new FileWriter(file)); 
        br.write(jsonData); 
        br.close(); 
    } 
    
    @Override 
    public void save(List<T> serializableObjects) throws IOException { 
        saveImpl(serializableObjects); 
    } 
    
    @Override 
    public void save(T serializableObject) throws IOException { 
        saveImpl(serializableObject); 
    } 
    
    関連する問題