首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Java中处理对象的可选变量?

如何在Java中处理对象的可选变量?
EN

Stack Overflow用户
提问于 2010-04-17 11:36:46
回答 2查看 144关注 0票数 2

对于我的交易程序,我有一个Merchant类。给定的Merchant对象可能具有特定的特殊属性,也可能不具有特定的特殊属性。例如,一个Merchant对象可能具有股票经纪人属性,另一个Merchant对象可能具有Financial Services和股票经纪人属性,而另一个Merchant对象可能根本没有特殊属性。

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

代码语言:javascript
运行
复制
Map<Qualities, Boolean> merchantQualities = new HashMap<Qualities, Boolean>();

唯一的问题是,对于Merchants来说,至少有50种可能的特殊质量,因此将质量类中的所有质量细分为子类将是非常令人厌烦的。

有没有一种更好的方法来编码这些可选的特殊质量,并在Merchants类中表示它们,而不是使用HashMap并子类化一个质量类?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-17 11:40:40

这完全取决于Qualities是什么以及它们做了什么。如果列表相当稳定,enums可能是一个很好的解决方案:

代码语言:javascript
运行
复制
enum Quality {
  MERCHANT,
  STOCKBROKER,
  ...
}

enum的好处是它们基本上是类,所以可以实现接口,并具有状态和行为。它们还附带了有用的助手类:

代码语言:javascript
运行
复制
Set<Quality> = EnumSet.of(MERCHANT, STOCKBROKER);

然后你就可以使用所有的Set函数了,比如contains()等等。

但在不了解更多信息的情况下,我无法告诉您这是否是适合您的解决方案。

编辑:在许多语言中,一个常见的起点就是枚举。在C/C++/C#中,这类似于:

代码语言:javascript
运行
复制
if (merchantType == STOCKBROKER) { ... }

下面是Java的枚举更好的地方。假设您为股票类型定义了另一个枚举:

代码语言:javascript
运行
复制
enum StockType {
  LISTED_EQUITIES,
  MANAGED_FUNDS
}

如果你假设一个给定的商家类型销售一种类型的东西:

代码语言:javascript
运行
复制
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;
  }
}

因此,与其说:

代码语言:javascript
运行
复制
StockType stockType;
if (merchantType == MerchantType.STOCKBROKER) {
  stockType = StockType.EQUITIES;
}
...

你可以说:

代码语言:javascript
运行
复制
StockType stockType = merchantType.getStockType();

Java枚举有状态和行为。这是一个非常强大的概念。

但你可以做得更好。与其假设每个商家一只股票,不如通过行为来处理:

代码语言:javascript
运行
复制
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);
  }
}

在这一点上,你的代码会变成:

代码语言:javascript
运行
复制
if (merchantType.canSell(StockType.LISTED_EQUITIES)) {
  ...
}

这是一种更自然、更具可读性和可扩展性的解决方案。

票数 10
EN

Stack Overflow用户

发布于 2010-04-17 11:57:08

我认为你可以使用这里的装饰器模式来装饰你的商家与各种装饰器(股票经纪人,金融服务。等)看一看http://en.wikipedia.org/wiki/Decorator_pattern

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2657123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档