字符串方法综合使用
最近,我在一次培训课程中辅导初中生。 任务之一是编写一个类,该类可以根据某些字符串键使映射变形。 创建的初级人员之一的结果包含以下方法:
void dwarwle(HashMap<String,Dwarwable> mapToDwarwle, String dwarwleKey){
for( final Entry<String, Dwarwable> entry : mapToDwarwle.entrySet()){
dwarwle(entry.getKey(),entry.getValue(),dwarwleKey);
}
}
该代码通常还可以。 使用散列表中分配给它的实际键来对单个可变形条目进行变形的方法,并且该变形键被分解为单独的方法。 非常简单,我不在这里列出。 只要您知道什么实际上是矮人,变量名也有意义。 该方法简短易懂,但是参数列表需要一个HashMap
而不是Map
。 为什么我们要限制调用者使用HashMap
? 如果调用者有一个TreeMap
并且有充分的理由,该怎么办。 我们是否想要一种可以使TreeMap
相形见separate的单独方法? 当然不是。
期望接口,通过实现。
大三学生将代码替换为HashMap
改为Map,但是大约五分钟后,这位聪明的女士举起了手,并提出了以下问题:
“如果我们将HashMap更改为Map,为什么不将String更改为CharSequence?”
当问题突然出现时,要回答这样的问题并非易事。 我想到的第一件事是原因是我们通常以这种方式这样做,这就是原因。 但这不是一个真正的论点,至少我不会接受那样的事情,除了学生我也不接受这样的回答。 无论如何,这将是非常独裁的风格。
真正的答案是,该参数用作映射中的键,并且映射的键应该是不可变的(至少突变应具有对等值和哈希码计算的弹性)。 CharSequence
是一个接口,而Java中的接口(很遗憾)不能保证不变性。 只有实现可以。 String
是此接口的一个良好的,广为人知的且经过测试的实现,因此可以是一个不错的选择。 关于stackoverflow有很好的讨论。
在这种特殊情况下,我们期望实现,因为我们需要不可变的东西,并且我们“不能”信任调用方传递不可变的字符序列实现。 或者:可以,但是要付出代价。 如果随后传递并修改了StringBuilder
,那么我们矮小的库可能无法正常工作,并且可能会开始责备战争。 在设计API和库时,我们不仅应考虑可能的使用,还应考虑实际的平均使用情况。
一个库与它所使用的库一样好,而不是可以使用的库。
这也可以应用于其他产品,不仅是库,而且可能会导致太大的问题(物理和武器)。
翻译自: https://www.javacodegeeks.com/2014/10/why-to-use-string.html
字符串方法综合使用