在地图上使用自定义类有什么好处?

时间:2019-07-01 05:23:30

标签: java

我有一段代码可以从输入中返回一个最小值和最大值。我需要知道使用具有最小和最大字段的自定义类比使用具有这两个值的映射有什么好处?

//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

5 个答案:

答案 0 :(得分:1)

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

但是现在让我们假设,这不是一个主要因素,并且您的示例过于简单,以至于我也不会使用malloc。我要使用的是Apache Commons的Map类: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类是泛型的,有两种泛型类型,每个字段一个。您基本上可以定义一对对象,并获得类型安全性,IDE支持,自动完成功能以及了解内部内容的巨大好处。 Pair还具有地图无法提供的功能。例如,Pair可能是可比较的。如果您想将其用作另一个Pair中的密钥,请参见ImmutablePair

Map

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我想从编程语言的使用角度来看。不管是哪种语言,都会有多种方法来达到目的(容易/不好/复杂/执行...)。考虑到像Java这样的面向对象语言,此问题将更多地指向解决方案的设计方面。

  

考虑可访问性。

Map中的值是public,您可以从代码的任何部分随意修改内容。如果您的条件是最小值和最大值应在[-100,100]范围内,并且如果您的代码的某些部分在地图中插入了200,则说明存在错误。好的,我们可以通过验证进行覆盖,但是您将编写多少个验证实例?但是一个对象?总是存在封装的可能性。

  

想重用

。如果在另一个代码位置有相同的要求,则必须再次重写映射逻辑(可能带有所有验证?)看起来不好吗?

  

可扩展性

。如果您想要更多数据(例如中位数或平均值),则必须使用错误的键来弄脏地图或创建新地图。但是对象总是很容易扩展。

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

最后但并非最不重要的一点是,请考虑代码的可读性和认知复杂性。与具有相关职责的对象相比,不清楚的通用存储总会更好。

希望我有道理!

答案 3 :(得分:0)

好处很简单:使您的代码更清晰,更健壮。
MaxAndMinValues名称及其类定义(两个字段)传达了一个最小值和一个最大值,但总的来说,它确保仅接受这两件事,并且其类API易于说明如何知道如何从中存储/获取值它。
尽管Map<String, Double> minAndMaxValuesMap传达了一个最小值和一个最大值存储在其中的想法,但在设计方面也有多个缺点:

  • 我们不知道如何添加值就不知道如何获取它们。
    关于它,如何命名我们在地图中添加条目的键? String的密钥类型太宽。例如,将接受“ MIN”,“ min”,“ Minimum”。枚举可以解决此问题,但不能解决所有问题。
  • 我们不能确保添加两个值(最小值和最大值)(而arg构造函数可以做到这一点)
  • 我们可以在地图中添加任何其他值,因为这是一个Map而不是固定的数据结构。

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

答案 4 :(得分:0)

我们在Hashmap上使用了自定义类,以根据值部分对Map进行排序