最近在培训课期间指导初学者。任务之一就是要大家完成一个类,要求这个类对key为String类型的map执行dwarwle操作。其中一位学员完成的类中,有如下方法:

void dwarwle(HashMap<String,Dwarwable> mapToDwarwle, String dwarwleKey){
for( final Entry<String, Dwarwable> entry : mapToDwarwle.entrySet()){
dwarwle(entry.getKey(),entry.getValue(),dwarwleKey);
}
}

这段代码总的来说是OK的。该方法将map中每个Dwarable的key和值,以及和它期望被分解的dwarwleKey一同传得给另一个调用方法。因为功能简单,我就不详细描述了。只要了解dwarwle的含义,就能轻易地知道这个方法会干什么。这样的函数简单且具有较好的可读性。但是,这个方法期待参数是一个HashMap,而不是Map。为什么在这里我们会强迫调用者使用HashMap呢?如果调用者出于某种原因需要使用TreeMap,那么是不是还要重新添加另外一个相同的方法来接受TreeMap呢? 当然不是。

“参数类型使用接口,调用时传入实现该接口的对象。”

这位初学者使用Map代替了HashMap。但是大约5分钟之后,这位聪明的女士又提出了这样一个问题:

“如果我们用Map替换HashMap,那么为什么不用CharSequence来替换String呢?”

突然要回答这样的问题可不是那么容易的。首先我想到是,我们通常都那么做,这就是原因。但是这个答案根本没有说服力,至少我本人不会接受这样的回答,我也希望我的学生不要接受这样的答案。这是一种非常独裁方式的回答。

真正的答案是,因为这个参数作为Map的key,而Map的key通常期望是不可变的(至少变化不会影响equals和hashCode的计算)。CharSequence是一个接口,Java并没有规定接口的可变性,只有具体的实现才能决定。String是CharSequence的具体实现,被广泛熟知并且经过了严格的测试,在这里是个不错的选择。

在这个具体的例子中,我们更倾向于String,因为它是不可变的(Immutable)。并且我们不能完全信任调用者会传递一个不可变的CharSequence的具体实现。假如我们可以信任调用者,那么我们可能为此付出代价。当StringBuilder作为参数传递到该方法,并且之后它的值发生了改变,我们写的类库就很可能不会工作。当设计API或者类库的时候,我们要考虑的不仅是我们期望的某些可能,而且需要考虑现实中的种种可能。

“实践才是检验真理的唯一标准。”

不仅限于类库,这也可能适用于其他产品。这似乎扯远了。

原文链接: http://www.javacodegeeks.com/2014/10/why-to-use-string.html
翻译: nealjob
译文链接: importnew

为什么要使用String的更多相关文章

  1. 透过WinDBG的视角看String

    摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...

  2. JavaScript String对象

    本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...

  3. ElasticSearch 5学习(9)——映射和分析(string类型废弃)

    在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...

  4. [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

    string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...

  5. js报错: Uncaught RangeError: Invalid string length

    在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...

  6. c# 字符串连接使用“+”和string.format格式化两种方式

    参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...

  7. 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed

    之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...

  8. JavaScript中String对象的方法介绍

    1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...

  9. 在多线程编程中lock(string){...}隐藏的机关

    常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...

  10. BCL中String.Join的实现

    在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...

随机推荐

  1. MySQL中JSON字段的使用技巧

    mysql5.7.8之后开始原生支持json. 在类似mongodb这种nosql数据库中,json存储数据是非常自然的, 在mysql中合理的使用json,能够带来极大的便利 Json字段的使用场景 ...

  2. Anaconda+django写出第一个web app(三)

    前面我们已经建立了模型Tutorial,也已经可以用Navicat Premium打开数据看查看数据,接下来我们通过建立admin账户来上传数据. 在命令行执行如下命令来创建用户: python ma ...

  3. jquery 根据后台传过来的值动态设置下拉框、单选框选中

    更多内容推荐微信公众号,欢迎关注: jquery  根据后台传过来的值动态设置下拉框.单选框选中 $(function(){ var sex=$("#sex").val(); va ...

  4. sql____001

    题目: create table my_001 (id int,value int); insert into my_001 values(1,10): insert into my_001 valu ...

  5. 禅道CMS 获文件名脚本

    use Net::HTTP::GET; use Base64; ; windowWidth=; windowHeight=; sid=jg9g2mk5kmru46lmd3g2evoc87>; # ...

  6. MySQL 5.6 GTID Replication【转】

    一. MySQL 5.6引入了GTID的概念,那么GTID是何方神圣?其实也不复杂,就是一个全局事务标示符.使用GTID时,每次事务提交都会在binlog里生成1个唯一的标示符,它由UUID和事务ID ...

  7. HTML5学习--SVG全攻略(基础篇)

    明天高级篇 一.什么是SVG? SVG 指的是可伸缩矢量图形 (Scalable Vector Graphics),它用来定义用于网络的基于矢量的图形,使用 XML 格式定义图形.SVG 图像在放大或 ...

  8. Git系统学习网址

    https://code.csdn.net/help/CSDN_Code/progit/zh/07-customizing-git/01-chapter7

  9. jquery 绑定,mvc和webform的三种方式

    asp.net里的绑定方式,on的绑定方式无效 $('#SelCommandType').bind('click', function () { }); mvc里的绑定方式 $('#DownList' ...

  10. 关于主键的设计、primary key

    主键:用于唯一标识一个表中一行数据. 外键:用于建立两个表之间的关系,A表中有一列是B表中的主键,那么A表中这列的数据就受到B表主键的约束. 那么关于主键应该如何设计呢,这里我说下优缺点: 1.用自动 ...