【问题标题】:What is the benefit of using a custom class over a map? [duplicate]在地图上使用自定义类有什么好处? [复制]
【发布时间】:2019-07-01 05:23:30
【问题描述】:

我有一段代码从它所接受的一些输入中返回最小值和最大值。我需要知道使用具有最小和最大字段的自定义类与使用具有这两个值的地图相比有什么好处?

//this is the class that holds the min and max values
public class MaxAndMinValues {
   private double minimum;
   private double maximum;

   //rest of the class code omitted
}

//this is the map that holds the min and max values
Map<String, Double> minAndMaxValuesMap

【问题讨论】:

  • 也许您很快就会需要一个新字段average
  • 如何将min AND max 值存储在Map&lt;String, Double&gt; 中以获得相同的键?
  • @AxelH 我假设 min 和 max 是键
  • @JoakimDanielson Oooooww,我没有读过他的问题。

标签: java


【解决方案1】:

最明显的答案是面向对象的编程方面,例如具有功能的数据的可能性,以及派生该类的可能性。

但我们暂时假设,这不是主要因素,而且您的示例过于简单,我也不会使用 Map。我会使用来自 Apache Commons 的 Pair 类:https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/tuple/Pair.html

(不可变对): https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/tuple/ImmutablePair.html

Pair 类是泛型的,有两种泛型类型,每个字段一个。您基本上可以定义 Pair of something,并获得类型安全、IDE 支持、自动完成以及了解内部内容的巨大好处。 Pair 还具有地图无法提供的功能。例如,Pair 可能是 Comparable。另请参阅 ImmutablePair,如果您想将其用作另一个 Map 的密钥。

public Pair<Double, Double> foo(...) {
    // ...
    Pair<Double, Double> range = Pair.of(minimum, maximum);
    return range;
}

这个类的最大优点是,您返回的类型公开了包含的类型。因此,如果需要,您可以从单个方法执行中返回不同的类型(无需使用映射或复杂的内部类)。

例如Pair&lt;String, Double&gt;Pair&lt;String, List&lt;Double&gt;&gt;...

【讨论】:

    【解决方案2】:

    在简单的情况下,你只需要存储用户输入的minmax值,你的自定义类就可以比使用Map,原因是:在Java中,Map对象可以是HashMapLinkedHashMap 或和TreeMap。它可以让您在很短的时间内将数据带入其结构以及从对象中获取价值时。因此,在简单的情况下,正如您刚才所描述的,只需要使用您的自定义类,此外,您可以在您的类中编写一些方法来处理用户输入,而 Map 无法为您处理。

    【讨论】:

      【解决方案3】:

      我想说从编程语言的使用角度来看。让它成为任何语言,都会有多种方法来实现结果(简单/糟糕/复杂/执行......)。考虑到像 java 这样的面向对象的语言,这个问题更多地指向解决方案的设计方面。

      考虑可访问性。

      Map 中的值是公开的,您可以从代码的任何部分随意修改内容。如果您的条件是最小值和最大值应在 [-100 ,100] 范围内,并且如果您的代码的某些部分将 200 插入到地图中 - 您有一个错误。好的,我们可以用验证来掩盖它,但是您会编写多少个验证实例?但是一个对象?总有封装的可能性。

      考虑重复使用

      。如果您在其他代码位置有相同的要求,则必须再次重写映射逻辑(可能包含所有验证?)看起来不太好,对吧?

      考虑可扩展性

      。如果您想要更多数据,例如中位数或平均值 - 您必须使用坏键弄脏地图或创建新地图。但是一个对象总是很容易扩展。

      所以这一切都与设计有关。如果您认为它是一次性使用,则地图可能会做(无论如何都不是标准设计。地图必须在技术和功能上包含一种数据)

      最后但同样重要的是,考虑代码可读性和认知复杂性。具有相关职责的对象总是比不明确的通用存储更好。

      希望我说得有道理!

      【讨论】:

        【解决方案4】:

        好处很简单:让您的代码更清晰、更健壮。
        MaxAndMinValues 名称及其类定义(两个字段)传达了一个最小值和一个最大值,但总体而言,它确保只接受这两个东西,并且它的类 API 是不言自明的,知道如何从中存储/获取值。
        虽然Map&lt;String, Double&gt; minAndMaxValuesMap 也传达了存储最小值和最大值的想法,但它在设计方面也有多个缺点:

        • 如果不查看这些值是如何添加的,我们不知道如何检索这些值。
          关于它,如何命名我们在地图中添加条目的键? String 键类型太宽泛。例如“MIN”、“min”、“Minimum”将被接受。枚举可以解决这个问题,但不是全部。
        • 我们无法确保添加了两个值(最小值和最大值)(而 arg 构造函数可以做到这一点)
        • 我们可以在地图中添加任何其他值,因为这是一个地图,而不是数据方面的固定结构。

        除了通常更清晰的代码的想法之外,我还要补充一点,如果 MaxAndMinValues 仅用作特定方法或 lambda 中的实现细节,则使用 Map 甚至数组 {15F, 20F} 会可以接受。但是如果这些数据是通过方法来操作的,你就必须尽可能清楚地表达它们的含义。

        【讨论】:

          【解决方案5】:

          我们使用自定义类而不是 Hashmap 来根据值部分对 Map 进行排序

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-07-16
            • 2020-10-22
            • 1970-01-01
            • 2023-02-10
            • 2011-03-16
            • 1970-01-01
            • 2019-08-22
            • 2015-11-10
            相关资源
            最近更新 更多