2017-12-12 10 views
0

を使用していないインタフェースの実装では、私は1つのインターフェイスを持つメソッドのパラメータ

このための3つの実装があります
public interface ItemFilter{ 
    public List<Item> filter (List<Item> items, List<Obj1> obj1List, List<Obj2> obj2List) 
} 

public Class Filter1 implements ItemFilter { 
    public List<Item> filter (List<Item> items, List<Obj1> obj1List, List<Obj2> obj2List) { 
     // Some logic like 
     if (obj1List != null) { 
      return items; 
     } 
    } 
} 

public Class Filter2 implements ItemFilter { 
    public List<Item> filter (List<Item> items, List<Obj1> obj1List, List<Obj2> obj2List) {    
     // Some logic like 
     if (obj2List != null) { 
      return items; 
     } 
} 

public Class Filter3 implements ItemFilter { 
    public List<Item> filter (List<Item> items, List<Obj1> obj1List, List<Obj2> obj2List) { 
     // Some logic like 
     if (obj1List.size() !=0 && obj2List.size() !=0) { 
      return items; 
     } 
    } 
} 

Filter1itemsFilter2itemsFilter3itemsをフィルタリングするobj1Listobj2Listを使用してフィルタリングするobj2Listを使用してフィルタリングするobj1Listを使用しています。

filterChainをループ内のすべてのフィルタで繰り返したいと思っています。

public Class FilterChain implements ItemFilter { 
     // Injected the Filter1, Filter2, Filter3 from guice multibinder 
     @Inject 
     private Set<ItemFilter> itemFilters; 

    public List<Item> filter (List<Item> items, List<Obj1> obj1List, List<Obj2> obj2List) { 
     List<Item> resultItems = items; 
     for(ItemFilter itemFilter : itemFilters) { 
      resultItems = itemFilter.filter(resultItems, obj1List, obj2List); 
     } 
     return resultItems; 
    } 
} 

ここでクラスFilter1フィルタ方式のimplementaionは、変数として、余分なobj2Listを持つことになります。 1つの実装で使用されていないインタフェース宣言で変数を持つことはOKですか?

主なアイデアは、異なるフィルタを使用すると、異なるクラスのフィルタリングロジックを簡単に切り離すことができます。異なるフィルタは異なるパラメータを使用してList<Item>をフィルタしています。

+2

'Public class Interface'はインタフェースではないクラスです。 –

+0

'items == obj1List == obj2List'なので、宣言された別の型だけで?それとも3つの特有のリストですか? – Izruo

+1

"2つの実装があります" - あなたは3つを表示しますか? – alfasin

答えて

1

はい、一部のメソッド実装ではメソッド引数のいくつかを無視することは絶対にOKです。

もちろん、このような状況では、すべての引数の役割について考える必要があります。また、より少ない引数を使用するようにコードをリファクタリングすることもできます。しかし、あなたが良いリファクタリングをしていない場合は、部分的に無視された議論を続けてください。

1

"インプリメンテーションで使用されていないインタフェース内の変数を持つことは大丈夫ですか?"は主観的です。 Javaはあなたがそれをするのを確実に禁じません。あなたがリファクタリングすることができれば、おそらくそれはより洗練されたものになります。たとえば、パラメータ化されたソリューションです。

public <T> void filter(List<T> items); 

し、必要に応じて、あなたは別のロジックと各実装であなたの実装

public <T> void filter(List<T> items) { 
    // do stuff 
} 

を持っています。

関連する問題