2012-01-12 7 views
1

私は似ているが少し異なる場合がありFunction<A,B>Function<B,C>グァバ関数合成

の構図である、Function<A,C>を作成するためのユーティリティがあることを見ました。

私の最初の機能は、BOクラスのキーに基づいて列挙型を返すvalueOfFunctionです。

secind関数は、BOオブジェクトであるEnumのメソッドを呼び出します。

だから、それは正確にA->B->C

ではありませんここでは、関数の:

private final static class RequestConvertor implements Function<CoreData, List<Request>> { 
    private final static Function<String,RequestConvertorEnum> typeConvertor = valueOfFunction(RequestConvertorEnum.class); 

    @Override 
    public List<Request> apply(CoreData coreData) { 
     RequestConvertorEnum requestConvertorEnum = typeConvertor.apply(coreData.getType()); 
     return requestConvertorEnum.convertToRequests(coreData); 
    } 

} 

はここで列挙の方法です:

private final List<Request> convertToRequests(CoreData coreData) { 
     List<PropertyWrapper> properties = getProperties(coreData); 
     if (properties.size() == 0) { 
      return Collections.emptyList(); 
     } 
     Request request = new Request(coreData.getKey(), properties, new RequestMetaData(
       coreData.getFoo())); 
     return newArrayList(request); 
    } 

は、これらの二つの機能を一緒に合成するよりよい方法はありますか?あなたはすぐにapplyメソッドを呼び出す別の関数(それはprivate staticメンバーだ)でのみを使用している -

答えて

1

私はvalueOfFunctionの使用量が最初の場所では不適切だと思います。表していない文字列を供給すると、列挙型の値のいずれかがIllegalArgumentExceptionをスローしますが、あなたの現在のコードでは、実行時にNullPointerExceptionEnums.valueOfFunction returns null if the Enum constant does not exist)可能性を秘めていると私はあなたを想定することを

private final static class RequestConvertor 
     implements Function<CoreData, List<Request>> { 
    @Override 
    public List<Request> apply(CoreData coreData) { 
     return RequestConvertorEnum.valueOf(coreData.getType()) 
       .convertToRequests(coreData); 
    } 
} 

注:あなたは、古き良きEnum.valueOf(String)静的メソッドを使用する必要がありますそれを認識している(あなたがいない場合は、あなたは今:))。

さらに、コードの残りについての提案はほとんどありません。変更可能性が必要ない場合は、ArrayListsの代わりにImmutableListsを使用してください(Collections.emptyList自体は不変なので結果を変更しないと仮定します)。結果がconvertToRequestsのメソッドを変更すると実行時に失敗します。

private final ImmutableList<Request> convertToRequests(CoreData coreData) { // 1. 
    List<PropertyWrapper> properties = getProperties(coreData); 
    if (properties.size() == 0) { 
     return ImmutableList.of(); // 2. 
    } 
    Request request = new Request(coreData.getKey(), properties, 
      new RequestMetaData(coreData.getFoo())); 

    return ImmutableList.of(request); // 3. 
} 

いくつかの説明:

  1. 使用ImmutableList動作を保証するために、戻り値の型(immutablility)など。
  2. 空の不変リストを返しますが、better than JDK's oneを返します。
  3. 2と同じですが、シングルトン不変リストはここにあります。

不変性が必要な場合は、ImmutableList.ofをLists.newArrayListに置き換え、メソッドのシグネチャをそのままにします。

+0

ありがとうございました。私はEnumに変換する可能性のある例外を認識しています。文字列としての型は、DBを作成するときに持っているものであり、必要なときだけEnumに渡して変換する方が好きです。コレクションについてのご意見ありがとうございます。私は不変のリストを使うことができると思います。 –

+0

String - > Enum定数は、両方のバージョンで 'RequestConvertor'のapplyメソッドで必要なときにのみ行います。あなたは' valueOfFunction.apply'メソッドを呼び出すでしょう。そして、私は 'Enum.valueOf'静的メソッドを代わりに呼び出すでしょう。 。 – Xaerxess