2017-09-04 13 views
1

オブジェクトを渡すのは良い方法ではありません。しかし、この場合、それは私にとって最高の解決策であるようです。java.lang.Objectをパラメータとして渡します

public void doSomething(final Object obj) { 
    // some code 
    ... 
    if (obj instanceof InputStream) { 
      document = PDDocument.load((InputStream) obj); 
    } else if (obj instanceof File) { 
     document = PDDocument.load((File) obj); 
    } else { 
     throw new IllegalArgumentException("Argument must be an instance of " + InputStream.class.getName() + " or " + " " + File.class.getName() + "."); 
    // more code 
    ... 
    } 
} 

代替ソリューションは、私が最初のソリューションを好むため、重複したコードに多くの重複コード(PDDocument.load(obj);前と後のすべての行)

public void doSomething(final InputStream obj) { 
    // some code 
    ... 
    document = PDDocument.load(obj); 
    // more code 
    ... 
    } 
} 

public void doSomething(final File obj) { 
    // some code 
    ... 
    document = PDDocument.load(obj); 
    // more code 
    ... 
    } 
} 

を持っているでしょう。

この問題を解決するためのより良い解決策がありますか?

+0

それらを混ぜる。重複したコードで共有メソッドを呼び出す2つの別個のメソッドがあります。 – Stultuske

答えて

6

パス2つの上の方法で呼び出すことができる別private方法に移動

// some code 
... 
document = PDDocument.load(obj); 
// more code 


これは// some codeloadコールのセットアップのいくつかの種類をやっていないことを前提としています。そのような場合、あなたはFunction<? super T, PDDocument>に渡すことができますから、それをロードしようとしているTと一緒に:

public <T> void doSomething(final T obj, Function<? super T, PDDocument> loader) { 
    // some code 
    PDDocument document = loader.apply(obj); 
    // other code. 
} 

と同様に起動します。PDDocumentので

doSomething(someFile, PDDocument::load); 
doSomething(someInputStream, PDDocument::load); 
+1

私はこのアイデア、3つのメソッド(ドキュメントをインスタンス化し、完全なロジックを持つ 'PDDocumentドキュメント 'を受け入れる3番目のプライベートを呼び出す特定のパラメータを持つ2つのメソッド)を使用します。私はこれがあなたの考えであると思います。 – AxelH

+2

@AxelHここでのアイデアは、デメテルの法則(最小知識の原則)です。このメソッドは、ドキュメントがファイルから読み込まれているか、ストリームなどから読み込まれているかを知る必要はありません。ドキュメントが必要です。あなたが必要とするものを単に渡すことは、コードをよりシンプルにし(1つのメソッドしか必要としません)、*より柔軟に(より広い範囲のソースからのドキュメントに '何か 'できる) –

0

のみメソッドへのパラメータとして

PDDocument.load(specificallyTypedVariable) 

の結果で

1

InputStreamから読み込むことができますし、あなたは、私がお勧めしたい、とにかくFileからInputStreamを得ることができます:クールの

public void doSomething(final InputStream in) 
{ 
    // some code 
    document = PDDocument.load(in); 
    // more code 
} 

public void doSomething(final File file) 
{ 
    try (
     final InputStream in = new FileInputStream(file); 
    ) { 
     doSomething(in); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } 
} 

e、それに応じてエラーを処理する!あなたがdocumentを返し、voidを返すメソッドでその処理を入れない理由


また、私は理解していませんか?

+1

nit: "リソース仕様で宣言された変数は、明示的にfinal宣言されていない場合、暗黙的にfinal(4.12.4)と宣言されます。"明示的にfinalにするのは単なるノイズです。IM: –

+0

"InputStream"オーバーロードに "... some code ..."部分を追加して、コードの重複をどのように減らすかをより明確にすることができます。 – Kayaman

+0

この考え方には若干のバリエーションがあります: 'File'に過負荷を与えないでください。' InputStream'を渡すようにしてください。発信者はそれを行う方法を決定できます。 –

関連する問題