这一切都取决于它们是什么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
}
如果您假设给定的商家类型销售一种类型的东西:
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 枚举具有状态和行为。这是一个非常强大的概念。
但你可以做得比这更好。与其假设每个商家一个股票,不如通过行为更好地处理:
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)) {
...
}
这是一个更加自然、可读和可扩展的解决方案。