2011-01-17 11 views
4

私は列挙型をとり、何らかの方法でそれを使用するメソッドを持っています。問題は、私は多くの異なる列挙型を持ち、受け入れられる方法は列挙型をメソッドに渡すことではないということです。異なる列挙型をメソッドに渡す方法は?

答えて

11

私は別のものを意味する一連の異なるenumクラスがあり、それらを1つのメソッドに渡したいと思っています。

public interface SpecialEnumType { 
} 

その後:

public enum MySpecialEnumType implements SpecialEnumType { 
    ... 
} 

public enum AnotherSpecialEnumType implements SpecialEnumType { 
    ... 
} 

を今すぐあなたの方法は、タイプSpecialEnumTypeのパラメータ受け入れる:marker interfaceを使用する、ことを行うには

ことをやった

public doSomething(SpecialEnumType specialEnumType) { 
    ... 
} 

を、あなたはできる:

obj.doSomething(MySpecialEnumType.SomeThing); 
obj.doSomething(AnotherSpecialEnumType.SomethingElse); 

一般に、メソッド引数のパラメータ型としてenumを使用するのは問題ありません。

UPDATE

サードパーティのAPIのと統合しながら、私は、このパターンを使用しました。たとえば、少し前に、私は別の配送業者と統合しなければなりませんでした。これを行うために、開発者が配送情報(アドレス、パッケージ、ウェイト、パッキングオプションなど)を送ることを可能にする一般的なインターフェイスを提供しました。新しい提供物との統合を実装したい場合は、インターフェースを実装するだけでした。

現在、各配送業者には独自のオプションがあります。マーカーインターフェイスを使用する前に、(すべての異なる配送業者の)すべてのオプションを含む単一の列挙型がありました。明らかにこれを維持することは困難です。しかし、インタフェースがメソッドの引数に特定の型の列挙型を指定しているため、列挙型を別のクラスに分割できませんでした。

マーカーインターフェイスを使用して、この問題を回避できました。 ShippingProviderOptionというインターフェースを作成しました。次に、各プロバイダについて、インタフェースを拡張して、そのプロバイダの特定のオプションとともに列挙型を作成しました。この方法で私はオプションを分けることができましたが、それでも共通のインターフェースを提示します。

コードに関する限り(大幅に簡素化し、実証のため、やや不自然な目的は):

public interface ShippingProviderOption { 
} 

public enum UPSOption implements ShippingProviderOption { 
    ... 
} 

public enum FedexOption implements ShippingProviderOption { 
    ... 
} 

public interface ShippingProvider { 

    public ShippingResponse ship(ShippingProviderOption option); 
} 

public class UPSProvider implements ShippingProvider { 

    @Override 
    public ShippingResponse ship(ShippingProviderOption option) { 

     if(option == UPSOption.PackageType) { 
      ... 
     } 
    }  
} 

public class FedexProvider implements ShippingProvider { 

    @Override 
    public ShippingResponse ship(ShippingProviderOption option) { 

     if(option == FedexOption.PickupType) { 
      ... 
     } 
    }  
} 

は今私の実際の実装では、私はマーカーインタフェースでいくつかのメソッドを持っています。したがって、実際にはマーカインタフェースである必要はありません。メソッドを含めることができます。

+0

Intersting、渡された値の使用方法の小さなコードサンプルを投稿できますか? – OscarRyz

+0

マーカーインターフェイスである必要があります。インタフェースには、使用に役立つメソッドを含めることができます。 –

+2

余分な型の安全について: 'public &SpecialEnumType> void doSomething(E e)' – finnw

関連する問題