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哦,我没读过他的问题。