これはすべて、彼らが何であり、何をするかに依存しQualities
ます。リストがかなり安定している場合は、enum
sが適切な解決策になる可能性があります。
enum Quality {
MERCHANT,
STOCKBROKER,
...
}
sの良いところenum
は、基本的にクラスであるため、インターフェイスを実装し、状態と動作を持たせることができることです。また、便利なヘルパークラスが付属しています。
Set<Quality> = EnumSet.of(MERCHANT, STOCKBROKER);
そうすれば、などのすべてのSet
機能を使用できます。contains()
しかし、これがあなたにとって適切な解決策であるかどうかは、詳細を知らなければわかりません。
編集:多くの言語でこれを行うための一般的な出発点は列挙型です。C / C ++ / C#では、これは次のようになります。
if (merchantType == STOCKBROKER) { ... }
Javaの列挙型がどのように優れているかを次に示します。在庫タイプに別の列挙型を定義するとします。
enum StockType {
LISTED_EQUITIES,
MANAGED_FUNDS
}
あなたが仮定をするならば、与えられた商人タイプは1つのタイプのものを売ります:
enum MerchantType {
STOCKBROKER(StockType.LISTED_EQUITIES),
FINANCIAL_ADVISER(StockType.MANAGED_FUNDS);
private final StockType stockType;
MerchantType(StockType stockType) {
this.stockType = stockType;
}
public StockType getStockType() {
return stockType;
}
}
だから言う代わりに:
StockType stockType;
if (merchantType == MerchantType.STOCKBROKER) {
stockType = StockType.EQUITIES;
}
...
あなたは言う:
StockType stockType = merchantType.getStockType();
Java列挙型には状態と動作があります。これは非常に強力な概念です。
しかし、あなたはこれよりもうまくやることができます。商人ごとに1つの在庫を想定する代わりに、これは行動によってより適切に処理されます。
enum MerchantType {
STOCKBROKER,
FINANCIAL_ADVISER;
private static final Map<MerchantType, Set<StockType>> STOCK_TYPES;
static {
STOCK_TYPES = new EnumSet<MerchantType, Set<StockType>>(MerchantType.class);
STOCK_TYPES.put(STOCKBROKER, EnumSet.of(StockType.LISTED_EQUITIES));
STOCK_TYPES.put(FINANCIAL_ADVISER,
EnumSet.of(StockType.LISTED_EQUITIES, StockType.MANAGED_FUNDS));
}
public boolean canSell(StockType stockType) {
Set<StockType> stockTypes = STOCK_TYPES.get(this);
return stockTypes != null && stockTypes.contains(stockType);
}
}
その時点で、コードは次のようになります。
if (merchantType.canSell(StockType.LISTED_EQUITIES)) {
...
}
これは、はるかに自然で、読みやすく、拡張可能なソリューションです。