【问题标题】:Implement uml Graph in Java用Java实现uml Graph
【发布时间】:2022-01-03 06:45:09
【问题描述】:

这个uml图在java中的合理实现是什么?

其中 Enumeration,Eiche,Buche,Esche 是德语,意思是枚举、橡木、山毛榉、灰烬。我的尝试如下

public class Material{

public static enum material{
oak, beech, ash
}

public int[] materialCost ={1,2,3};
}

问题在于,在我的家庭作业练习中,我找到了Table(Material.oak),所以我知道我的尝试一定是错误的。有人可以帮忙吗?

【问题讨论】:

    标签: java uml enumeration class-diagram


    【解决方案1】:

    总之

    public enum Material {
        Eiche,Buche,Esche;
        public int materialCost; // public access is not great, but that's the model
    } 
    

    基于UML图的详细论证

    UML 关键字 «enumeration» 在 Java 中对应于 enum

    诸如EicheBucheEsche 等UML 枚举字面量通常不带下划线,并被放置在仅包含字面量的单独隔间中。该隔间应以图形方式放置在操作下方,这些操作本身与属性分离。您的图形符号不尊重这种用法,因此需要仔细查看以避免混淆。 UML 类中带下划线的元素是静态元素,但在枚举的特定情况下,下划线表示“实例规范”(对于 UML 行话来说抱歉),即一些常量枚举值。

    materialCost 没有下划线。因此,它是一个正常的公共属性。一些语言不允许枚举的附加属性和操作,但 UML 允许。幸运的是,Java 也是如此。我们不知道该属性的类型,因此您可以选择与实现相关的内容; int 似乎还可以。 materialCost 不应该是一个数组:一个数组在 UML 中需要大于 1 的多重性,因为你可以有多个元素。在图中没有明确的多重性,这意味着(根据 UML 规范)多重性正好是 1。

    最后但同样重要的是,materialCost 可以根据 UML 模型随时进行完美修改,因为它后面没有 {readOnly}。这也不是一个操作,因为() 丢失了

    补充说明

    在 UML 中,枚举是一种值类型:如果两个实例具有相同的值,则它们被认为是相同的。 在 Java 中,这有点棘手,因为 the difference between == and .equals() 和在与枚举文字和没有附加字段的情况下比较时对 == 的特殊保证。对于这种混合枚举,有些谨慎似乎是可取的。

    【讨论】:

      【解决方案2】:

      您实际上可以在枚举类型上定义与普通类非常相似的属性:Oracle docs

      所以在你的例子中你可以做类似的事情

      public enum Material {
          EICHE(1),
          BUCHE(2);
      
          private final int cost;
      
          Material(int cost) {
              this.cost = cost;
          }
      
          int cost() {
              return this.cost;
          }
      }
      
      ...
      
      Material oak = Material.EICHE;
      System.out.println("One unit of Eiche costs " + oak.cost());
      

      【讨论】:

      • 不错的答案。但是这个实现不是让cost 在枚举构建后保持不变吗?这不会使 UML 中的成本为{readOnly}(图中不是这种情况)吗?
      • @Christophe 是的,你是对的 - final 修饰符不适合给定的模型。我仍然认为在构造函数中初始化每种材料的成本方面(表示需要有效设置)是一个值得注意的特性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      相关资源
      最近更新 更多