2010-04-17 54 views
2

对于我的交易程序,我有一个商户类。给定的商品对象可能有也可能没有特定的特殊质量或特殊质量。例如,一个Merchant对象可能具有股票经纪人的质量,另一个商人可能具有金融服务和股票经纪人的品质,而另一个商人可能根本没有特殊的品质。如何在Java中处理对象的可选变量?

我最初的想法是创建一个HashMap和素质类,如下所示:

Map<Qualities, Boolean> merchantQualities = new HashMap<Qualities, Boolean>(); 

唯一的问题是,至少有50个可能的特殊气质的商人,这样,这将是非常烦人子类来自Quality类的所有质量。

是否有更好的方式来编码这些可选的特殊品质,并在Merchants类中表示它们,而不是HashMap和子类Qualities类?

+0

做这些特质呢?他们如何使用? – cletus 2010-04-17 03:43:58

+0

@Cletus,谢谢你的回答。除此之外,品质用于确定商家可以访问的股票,并影响商家的买入和卖出。例如,股票经纪商有股票代码,金融服务商有金融服务产品,如股票住房贷款。 – Arvanem 2010-04-17 03:48:23

回答

10

这一切都取决于什么Qualities是什么,他们做什么。如果该列表是相当稳定的,enum小号可以一个很好的解决方案:

enum Quality { 
    MERCHANT, 
    STOCKBROKER, 
    ... 
} 

好事约enum s是他们基本上是类,因此可以实现接口,并有状态和行为。他们还配备了有用的辅助类:

Set<Quality> = EnumSet.of(MERCHANT, STOCKBROKER); 

,然后你可以使用所有的功能Set像等

但我不能告诉你,如果这是你的一个合适的解决方案,而不了解更多信息。

编辑:许多语言的共同起点是枚举。在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)) { 
    ... 
} 

这是一个更为自然,可读和可扩展的解决方案。

+0

Cletus,非常感谢您提供了这样一个优秀的学习答案,使我的和其他人的代码更加自然,可读和可扩展。 – Arvanem 2010-04-17 05:22:50