10月,我写了一个博客,题为“上帝对象中的顶级特朗普”,其中谈到了用167种不同的方法发现的对象的发现,这些方法将该对象与应用程序的所有其他部分链接在一起,并且正如您所期望的那样,上帝或怪物物的一般标准。 最近向我指出,仅方法计数并不表示一个对象是上帝对象 ,这是真的。 该注释还继续将String类定位为一个对象,该对象不是God Object,但具有大量方法。

这让我开始思考:就面向对象设计的一般规则而言,String类是设计良好的类吗? 实际上,它是否违反了单一责任原则或demeter的法律,并且是否与应用程序的所有其他部分紧密耦合? 它是上帝的对象吗?

回答此问题的简单方法是根据“单一职责原则”查看字符串 ,而做到这一点的最佳方法是计算其拥有的方法调用的数量并弄清楚它们的作用。

如果这样做,您会发现Java的String类中有66个方法调用,并且您可能会得出这样高的数字可能是God Object的第一个迹象。

接下来,如果您查看这66个方法调用,则可以将它们分为几个不同的责任领域。 例如,有:

转换方式

  • getBytes(...)
  • getChars(...)
  • 的价值(...)
  • toUpperCase(...)
  • toLowerCase(...)
  • toCharArray(...)


分割String的方法

  • 子串(...)
  • 分裂(...)
  • subSequence(...)


等效方法

  • 等于(...)
  • 火柴(...)
  • 相比于(...)


搜索方式

  • 指数(..)
  • lastIndexOf(...)
  • charAt(...)
  • 包含(...)


组合方法

  • 附加(...)
  • concat(..)
  • +
  • + =

……还有更多。

使用上面的列表,您现在可以为类似于以下内容的String编写CRC卡:“ String负责将其自身与其他String组合以创建新的String ,并将其自身转换为其他对象或对象数组并进行拆分本身分成不同的部分,并将其与其他String对象进行比较,并对其进行搜索”

坚持法律原则,上面的列表显示String的方法调用至少分为五个责任领域,这意味着从书上讲,违反了单一责任原则。

得出合理的结论,那么您可以重构String使其看起来像这样……。

但是,这就是问题,为什么Java的String类不是由一些数据和一堆在其上操作的类组成的? 答案既是见解又是多方面的。 首先,历史……随着时间的流逝,Java以及String类的发展也是如此。 随着Java版本号的不断提高,这些方法也被逐行添加。 第二,实用主义。 当前设计中的String对象可能会违反“单一职责规则”,但这并不重要,将其保留原样并继续编写重要的程序会更容易。 最后,我认为这很重要,我们通常都知道String是什么。 它的名称和含义是常用的。 如果我们必须定义String负责使用CRC卡的方式,那么我们将编写如下内容:“ String负责成为s String ”。

字符串可能有66种方法,但我相信,按照一般共识,它不是上帝的对象。 但是,软件只是一种意见问题,因此,我将让您回答我在本博客开头提出的其他问题,并让您下定决心……

参考: Java的String类是上帝对象吗? 来自我们的JCG合作伙伴   调试队长博客的 Roger Hughes。

翻译自: https://www.javacodegeeks.com/2012/02/is-javas-string-class-god-object.html

Java的String类是上帝的对象吗?相关推荐

  1. java string改变的影响_为什么Java的string类要设成immutable(不可变的)

    最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类 ...

  2. Java中String类的方法及说明

    String : 字符串类型 一.构造函数      String(byte[ ] bytes):通过byte数组构造字符串对象.      String(char[ ] value):通过char数 ...

  3. 阿里最新面试必备项之Java的String类,持续更新中!

    最新腾讯面试必备项之Java的String类,持续更新中! 1.1 String的特性 String类:代表字符串.Java程序中的所有字符串字面值(如"abc")都作为此类的实例 ...

  4. (JAVA)String类之比较方法

    /* 字符串: 一.概述:1.字符串在JAVA中,使用""表示2.java.lang.String类3.只要写""就是字符串对象.不需要new二.空参构造器ne ...

  5. Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释

    Java中String类的concat方法 在了解concat()之前,首先需要明确的是String的两点特殊性. 长度不可变 值不可变 这两点从源码中对String的声明可以体现: private ...

  6. java/04/String类的特点,String的常用方法,this关键字

    java/04/String类的特点,String的常用方法,this关键字 String 是一个字符串类型的类,使用"""双引号定义的内容都是字符串,但是String类 ...

  7. java中string类面试题_java中String类的面试题大全含答案

    1.下面程序的运行结果是()(选择一项) String str1="hello"; String str2=new String("hello"); Syste ...

  8. 【转载】Java中String类的方法及说明

    转载自:http://www.cnblogs.com/YSO1983/archive/2009/12/07/1618564.html String : 字符串类型 一.构造函数      String ...

  9. Java · 认识 String 类(上)· 创建字符串 · 字符串比较相等 · 字符串常量池 · 字符串不可变 · 字符字节与字符串

    目录 一.创建字符串 二.字符串比较相等 三.字符串常量池 3.1 直接赋值的内存情况 3.2 采用构造方法的内存情况 四.理解字符串不可变 五.字符.字节与字符串 5.1 字符与字符串 5.2 字节 ...

最新文章

  1. [短文速读] 重载有暗坑,JVM是如何执行方法的
  2. (转)rlwrap真是一个好东西
  3. JSP与mysql的连接
  4. 优化算法:粒子群算法,遗传算法,差分进化算法
  5. CSS样式为什么放在head中,而不放在body底部
  6. MySQL事务的介绍+事务的特性+事务的开启
  7. netbeans 源文件_具有NetBeans,WebLogic 12c,JPA和MySQL数据源的Arquillian
  8. kafka消费者脚本无法启动问题
  9. java 反射覆盖方法,java – 确定一个方法是否覆盖使用反射的另一个?
  10. SQLSERVER事务日志已满 the transaction log for database 'xx' is full
  11. 2018-1-27工作周总结
  12. 对本课程的期望以及教学建议
  13. 又一个程序员倒下-程序员防猝死指南
  14. 查看软件版本的cmd命令
  15. C#编程-39:字符和字符串笔记
  16. 命令行运行matlab的方法
  17. goods购物表MySQL的代码_第一节:数据库及表
  18. 【监控】Prometheus(普罗米修斯)监控概述
  19. 花儿花儿为谁开。。。
  20. Tensorflow nmt的超参数

热门文章

  1. follow 开源项目关于NoClassDefFoundError错误的解决方法
  2. 控制台查出数据传到layui数据表格却没有数据的问题
  3. 使用While循环语句值得注意的事
  4. cobol host变量_将Host Cobol批次和Monolith Webapps移动到云和微服务
  5. java 迁移数据_Java 10迁移建议
  6. jboss入门_JBoss Forge NetBeans集成–入门
  7. 高效的企业测试-工作流和代码质量(4/6)
  8. 使用Spring Boot和MongoDB构建一个反应式应用程序
  9. 使用Spring Boot,JHipster和React构建照片库PWA
  10. @async方法不调用了_在Spring中使用Future对象调用Async方法调用