【问题标题】:Does a class with has-a relationship with a Collection object have a relationship with the Collection's elements?与 Collection 对象具有 has-a 关系的类是否与 Collection 的元素有关系?
【发布时间】:2016-05-07 13:30:54
【问题描述】:

我正在学习 Java 8 Programmer II 认证,并且正在研究类可以拥有的关系。我了解组合,但我想知道作为类的类变量的集合的元素与该类之间是否存在关系。例如,考虑以下代码:

public class A {
    static ArrayList<String> strings = new ArrayList<String>();

    public A() {
        strings.add("foo");
    }
}

我们说字符串的String元素和A类有关系吗?

【问题讨论】:

    标签: java composition open-closed-principle


    【解决方案1】:

    首先,如果类A 具有像这样的简单String 字段,我们应该明确类AString 是否存在关系:

    public class A {
        static String aString;
    
        public A() {
           aString = "foo";
        }
    }
    

    ...我想是的!那将是“has-a”房地产-A has-a String

    在您的示例中,有一个 Strings 的集合。我们也可以说A 类有-a (很多;)Strings... 你可以想象A 类与String 对象有很多关系; A 类将它们聚合到集合中。这类似于众所周知的组合示例“汽车'有'轮子”

    您也可以说这是单向的一对多关系(单向的,因为这种关系只有一方知道另一方)。

    【讨论】:

      【解决方案2】:

      我会说是的。集合在这里几乎无关紧要,更多的是类和字符串之间“具有”关系的实现细节,而不是其他任何东西。至于这是一个类范围的关系而不是每个实例的关系这一事实,好吧,只要你知道并且这是你的意图就可以了。

      【讨论】:

        【解决方案3】:

        是的,它是"aggregation" 或组合,取决于相关对象的生命周期。另见https://softwareengineering.stackexchange.com/questions/61376/aggregation-vs-composition

        【讨论】:

          【解决方案4】:

          Has-a 和 is-a 是直观的概念。它们不是编译器会检查的规则。它是一种共享词汇,用于有效地与他人交流并用于做出设计决策。那么A类“有”那些字符串吗?是的,但是您很少会说您宁愿说 A 类有一个字符串集合。一个简单的类比是,当您提着一个包时,您不会立即说您在提着书,而是最有可能说您提着一个装满书的包(字符串集合)。

          【讨论】:

          • 见。取决于上下文。我们都不会错。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-10
          • 2016-07-09
          相关资源
          最近更新 更多