Java 在地图上使用自定义类的好处是什么?

Java 在地图上使用自定义类的好处是什么?,java,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 } //th

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

//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
//这是保存最小值和最大值的类
公共类MaxAndMinValues{
私人双最小值;
私人双倍最大值;
//省略了类代码的其余部分
}
//这是保存最小值和最大值的贴图
映射minAndMaxValuesMap

在简单的情况下,您只需要存储用户输入的
min
max
值,您的自定义类就可以比使用
Map
更好,原因是:在Java中,
Map
对象可以是
HashMap
LinkedHashMap
TreeMap
。它可以让您在很短的时间内将数据引入其结构,也可以让您从对象中获得价值。因此,在简单的情况下,正如您刚才所描述的,只需要使用您的自定义类,而且,您可以在类中编写一些方法来处理用户输入,这是映射无法为您处理的。

我要说的是,从编程语言使用的角度来看。不管是哪种语言,都会有多种方法来实现结果(简单/不好/复杂/执行…)。考虑到像java这样的面向对象语言,这个问题更多地指向解决方案的设计方面

想想可访问性

映射中的值是一种公共值,您可以根据需要从代码的任何部分修改内容。如果您有一个条件,最小值和最大值应该在[-100100]范围内&如果您的代码的某个部分在映射中插入了一个200,那么您就有一个bug。好的,我们可以用验证来掩盖它,但是您会编写多少个验证实例?但是一个物体?总有封装的可能性

想想重复使用

。如果您在另一个地方的代码中有相同的需求,那么您必须再次重写映射逻辑(可能需要所有验证?)看起来不太好,对吗

考虑可扩展性

。如果你想要一个以上的数据,如中位数或平均值,你要么用坏键弄脏地图,要么创建一个新的地图。但是对象总是很容易扩展的

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

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


希望我有点道理

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

但现在让我们假设,这不是一个主要因素,而且您的示例过于简单,因此我也不会使用
映射。我将使用Apache Commons中的
Pair
类:

(不可变对):

Pair
类是泛型的,有两个泛型类型,每个字段一个。您基本上可以定义一对内容,并获得类型安全性、IDE支持、自动完成,以及了解其中内容的巨大好处。另外,一对
具有地图无法提供的功能。例如,
可能具有可比性。如果要在另一个
映射中将其用作密钥,请参见
ImmutablePair

公共对foo(…){
// ...
配对范围=配对(最小、最大);
返回范围;
}
此类的最大优点是,返回的类型公开了包含的类型。因此,如果需要,可以从单个方法执行中返回不同的类型(无需使用映射或复杂的内部类)


e、 g.
Pair
Pair
..

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

  • 如果不查看这些值是如何添加的,我们不知道如何检索这些值。
    关于它,如何命名我们在地图中添加条目的键<代码>字符串
键的类型太宽。例如,“最小”、“最小”、“最小”将被接受。枚举可以解决这个问题,但不能解决所有问题
  • 我们无法确保添加了两个值(最小值和最大值)(而arg构造函数可以这样做)
  • 我们可以在地图中添加任何其他值,因为这是一个地图,而不是数据方面的固定结构
    除了一般更清晰的代码之外,我还想补充一点,如果
    MaxAndMinValues
    仅用作特定方法或lambda中的实现细节,则可以使用
    Map
    甚至数组
    {15F,20F}
    。但是,如果这些数据是通过方法操作的,那么你必须尽可能清楚地表达它们的含义

    我们使用Hashmap上的自定义类根据值部分对映射进行排序

    也许您很快就会需要一个新字段
    average
    ?如何将
    min
    max
    值存储在
    Map
    中的同一个键中?@AxelH我假设min和max是keys@JoakimDanielson哦,我没读过他的问题。