永远不要在Java中使用String(至少也尽量少用)

11 | “万金油”的String,为什么不好用了? Redis核心技术与实战 实践篇 11 | “万金油”的String,为什么不好用了? 阅读详情

永远不要在Java中使用String(至少也尽量少用:-)

永远不要使用(未封装)的String或long,int. 为什么呢? 因为这些基础类型(Primitive)没有语义(Semantic meaning). 它们很难被理解,维护和扩展.

空口无凭,举例为证: 假设有个例子是订阅电影票的服务.

试着比较:

public void bookTicket( String name, String firstName, String film, int count, String cinema);

与:(当然实际使用时,用一个Order对象会更好:-)

public void bookTicket( Name name, FirstName firstName, Film film, Count count, Cinema cinema);

很明显,第二个要容易阅读的多. 尤其是当在IDE中使用自动补全的时候,bookTicket(String arg0, String arg1, String arg2, int arg3, String arg4)比bookTicket(Name arg0, FirstName arg1, Film arg2, Count arg3, Cinema arg4)差的太明显了.当某个接口被置于一个不带源码的jar包内时,这种情况很常见.

再尝试比较:

void book(String orderId);

与:

void book(OrderId order);

第一种情况下,开发人员看到这行代码会考虑:a.)怎样获得一个orderId 和b.)orderId到底是什么玩意, "1212", "ABC-123" or "12-34-45-SCHWEINEBACKE". 第二种情况,他可以去查看OrderId类的Javadoc或者使用手册获取它的正确用法. 或许觉得, 这不过是个orderId罢了. 但在遗留系统中,名称和语义是经常不一致的. 我曾经见过一个系统里面把order ID命名为"orderId", "auftragsId", "id"以及其他什么东西,而且居然指的是同一个东西: order ID!

多使用类替代基本类型不光有语义上的优势. 扩展上也更佳: 比如你可以更轻松的将OrderId类里的int替换成long, 增加校验和id生成逻辑. 相比而言,最初若使用String类型要做这些就困难的多.

使用fluent interface实现

fluent interface可以使代码更短,编写更容易. Google Collections的MapMaker是个不错的例子:

ConcurrentMap graphs = new MapMaker()
    .concurrencyLevel(32)
    .softKeys()
    .weakValues()
    .expiration(30, TimeUnit.MINUTES)
    .makeComputingMap(
        new Function() {
            public Graph apply(Key key) {
                return createExpensiveGraph(key);
            }
        });

使用fluent interface实现的如下所示,像简单的领域类(Domain classes)或者像不可变值的对象. 仅仅是封装了String并增加了一些语义的信息给String.

public class Name {
   public Name(String name) {
      ...
   }
   public static Name name(String name) {
     return new Name(name);
   }
}

有人或许觉得这种方式太过繁杂(noisy)了. 比如:

new Customer(new FirstName("Stephan"), new Name("Schmidt"));

要比如下的直接使用String参数的方式繁杂.

new Customer("Stephan", "Schmidt");

但,不可否认,第一个要更加容易理解, 若使用静态方法,第一个方法也可以变为:

new Customer(firstName("Stephan"), name("Schmidt"));

这样也较好的解决了参数较多时让人糊涂的问题.

[文章翻译自:http://codemonkeyism.com/never-never-never-use-string-in-java-or-at-least-less-often/ 请任意转载]

基于大疆TSDK与Pix4D的热红外数据工程化处理:从RJPG到温度正射影像的完整工作流 本文详细介绍了基于大疆TSDK与Pix4D的热红外数据工程化处理完整工作流。通过Python脚本自动化解析RJPG格式的热红外图像,提取并转换其中的原始辐射数据为包含真实温度信息的TIFF文件,再结合Pix4Dmapper进行批量拼接,最终生成可直接用于GIS分析的温度正射影像图。该流程解决了手动处理效率低下、参数校准复杂等难题,实现了从原始数据到定量分析成果的高效、准确、可重复生产。 阅读详情

相关推荐

比Synergy更轻量!Barrier鼠标共享工具实测:5分钟实现Win/Mac/Linux三设备无缝切换

本文实测了开源免费的Barrier鼠标共享工具,详细指导用户如何在5分钟内于Windows、macOS和Linux三台设备间实现一套键鼠的无缝切换。文章对比了其与Synergy的优势,提供了分平台安装、核心服务端-客户端配置、防火墙设置等完整教程,并分享了解决连接问题的关键技巧,是提升多设备办公效率的实用指南。

weixin_29304021的博客 599

永远不要在Java中使用String(至少也尽量少用:-)

永远不要使用(未封装)的String或long,int. 为什么呢? 因为这些基础类型(Primitive)没有语义(Semantic meaning). 它们很难被理解,维护和扩展. 空口无凭,举例为证: 假设有个例子是订阅电影票的服务. 试着比较: public void bookTicket( String name, String firstName, String film...

weixin_30293135的博客 271

STLink驱动安装全攻略:从卸载到Keil配置的完整避坑指南

本文提供了STLink驱动安装与Keil环境配置的完整避坑指南。详细讲解了从驱动卸载、重装到Keil调试器设置的每一步,并针对常见的设备无法识别、连接不稳定等问题给出了深度解决方案,帮助开发者快速搭建稳定的STM32开发环境。

weixin_29182481的博客 425

Java线程同步

package work2; public class SynchronizedTest implements Runnable { int num = 50; @Override public void run() { // TODO Auto-generated method stub while(true) { ...

zhicheng_angle的博客 428

U3d WebGL使用ToLua

首先我们在编辑器模式下加入Tolua插件,然后配置修改到在编辑器模式下能够正常的运行。 同个U3d 插件Build出WebGL的工程,运行的时候你会发现(有些需要把这个WebGL工程放在一个HttpServer下面,直接本地访问index.html会被拒绝,让你使用http的格式)。 当要加载完的时候会出现 To use dlopen, you need to use Emscripten'...

qq_35267906的博客 2948

解构LOL数值平衡:从基础公式到实战决策的深层逻辑

本文深入解析了《英雄联盟》数值平衡的底层逻辑,从基础攻击力公式到经济系统设计,揭示了MOBA游戏背后的精密数学架构。通过实战案例展示护甲减伤、技能伤害建模等核心机制,探讨装备定价与战斗节奏的数值关联,帮助玩家理解版本更新中的平衡艺术。

weixin_42540248的博客 347

google Collection 的MapMaker使用体验

前几天准备在写一个本地缓存的时候,有一个功能是设置超时时间,我当时用的是每次get的时候判断上次get的时间,跟当前时间对比看是否超过预期时间,来决定是否过期的。        RednaxelaFX提示我说,可以考虑使用googleCollection的MapMaker,除了可以设置超时功能外,还可以绑定key的未取到值的function,当通过get(key)取缓存为空的时候,可以通过这

kjfcpua的专栏 5450

ms17-010 永恒之蓝漏洞利用+抓包分析过程

一、实验环境: 1、攻击机:Kali 1)攻击工具:msf 2)分析工具:wireshark 3)IP地址:192.168.204.157(自动获得) 2、靶 机:Windows7 1)版本:SP1 2)开启网络共享(SMB协议) 3)关闭防火墙 4)IP地址:192.168.204.150(自动获得) 3、网卡连接方式:Vmnet8(NAT) 二、实验步骤: ...

qq_41976183的博客 6948

Java中的String,StringBuilder,StringBuffer三者的区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String  String最慢的原因:  String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对...

SANG 519

AI 技术新手入门与实战指南

仅仅能对话还不够,实际应用中,我们往往需要让 AI 处理特定的业务数据。比如,从日志文件中提取错误码,或者将非结构化的用户反馈整理成 JSON 格式。这时候,自定义输入和严格的结果验证就显得尤为重要。假设我们需要让 AI 分析一段服务器日志,并只返回错误的级别和简述。请分析以下日志片段,提取所有 ERROR 级别的信息。要求输出格式为 JSON 列表,包含 'timestamp' 和 'message' 两个字段。不要输出任何多余的解释文字。日志内容: {

2600_94936330的博客 2681

《AI编程实战:深度学习模型改进与系统部署》,改进专栏目录和介绍

专深度学习相关项目都写在本专栏,《一次订阅解锁全部,都有源码,永久观看》,包括车牌识别、股票预测、人脸识别、风格迁移、图像修复、图像超分辨重建、图像分割等任务,Web/PyQt系统实现。引入Transformer、Swin Transformer、DenseNet、ViT、ConvNeXt等算法实战,提供卷积改进,魔改对比实验,模型剪枝,模型蒸馏,模型量化,全网独家整合改进专栏,为不同领域的同学发表论文提供了大力支持。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3272

String 只要在内存中创建好啦,就永远不改变了,这是为什么呢?

不可变,顾名思义,就是一旦对象被创建,其状态(内容)就无法更改。在 Java 中,String对象是不可变的,意味着一旦你创建了一个String实例,你就无法修改它的内容。如果你试图改变字符串,比如使用concat()方法或其他任何修改方法,实际上你会得到一个新的String对象,而原始字符串仍然保持不变。String的不可变特性在 Java 中是一个非常重要的概念,它不仅提升了程序的安全性和性能,还有助于内存管理。理解这个特性将帮助你在编写 Java 应用程序时做出更好的设计决策。通过使用或。

龚小帅的博客 1195

大规模新闻聚合爬虫实战:Python爬取数百万新闻数据的完整指南

本文详细介绍了如何构建一个大规模新闻聚合爬虫,结合Python异步爬虫技术,实现高效、稳定的新闻数据采集。增加NLP模块对新闻内容做自动分类、情感分析。引入机器学习模型检测新闻真实性。使用分布式爬虫框架进一步提升规模。增加多媒体内容抓取与处理。

2201_76125261的博客 1554

java中String和char

参考博客来源 https://blog.youkuaiyun.com/li_xiao_ming/article/details/78109462 一 char和string的区别: 1 char是表示的是字符,定义的时候用单引号,只能存储一个字符。例如; char='d'. 而String表示的是字符串,定义的时候用双引号,可以存储一个或者多个字符。例如:String=“we are neuer”。 2 char是基本数据类型,而String是个类,属于引用...

mlh532354163的博客 7813

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

永远不要使用==来比较字符串

       最近在看《Core Java 2》,有种相见恨晚的感觉,比先前看得几本书都要好很多,其中很多讲解堪称经典。其中关于测试字符串是否相等的部分就非常清楚。原文如下:Do not use the == operator to test whether two strings are equal! It only determines whether or not the strin

Jeffery Lee的专栏 1643

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java String 的hashCode

hash 的定义 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 Java 中 hash 值的含义 hash 值主要是用来在散列存储结构中确定对象的存储地址的,提高对象的查询效率,

weixin_42227763的博客 2229

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

指教!String对象永远不变,啥意思?

“java中String对象永远不变”这句话是什么意思? publicclassTest{ publicstaticvoidmain(String[]args){ Stringstr1="abc"; str1+="hhh"; System.out.println("str1:"+str1); } } ...

liuji0517的博客 422

java中的String为什么可以使用==比较字符串内容?

java中的String为什么可以使用==比较字符串内容? 一句话概括: java中的String是final类,final类是共享数据的,而java中==比较的是内存地址,而final类的String相同字符串,指向的是同一个地址! 详细: “==”在任何时候都是比较地址,这种比较永远不会被覆盖。 java中的String类是final类,final修饰类,被final

农夫子 4685

JAVA中String的底层解析

JAVA中String 是Final类不能被继承。JAVA 对String的处理和一般Class有所不同。 这文章主要是解释一下String的存储模式和java的字符串常量池的复用机制。 首先提出几个问题: 1.String的内容为什么是不可更改的? 2.JAVA中“adc”这种创建的字符串的创建过程是怎样的? 3.String(String string)的构造方法是如何工作的? 4.一个线程中...

AndroidMsky的博客 4894

Java中String转List和List转String四种方法

Java中String转List和List转String四种方法

李长渊的博客 1万+

Java Handle String

Java Handle String

3014

深入解析Java String对象创建:从常量池到new String的内存原理

在Java编程中,字符串处理是基础且高频的操作,理解其底层原理对编写高效代码至关重要。字符串常量池作为JVM内存模型的核心机制之一,通过缓存字符串字面量实现内存复用,这是Java性能优化的重要设计。其工作原理涉及编译期检查、类加载和运行时查找,旨在减少重复对象创建。从技术价值看,深入理解字符串创建机制能帮助开发者避免常见性能陷阱,如循环拼接导致的内存浪费。在实际应用场景中,无论是字面量赋值、new操作还是intern方法的使用,都直接关系到内存布局和GC效率。本文以一道经典面试题为切入点,结合字节码分析和内

dengjuanshou7445的博客 533

java String如何回收_关于java:String.intern()的垃圾回收行为

如果我使用String.intern()来提高性能,因为我可以使用" =="来比较内部字符串,是否会遇到垃圾回收问题? 内联字符串的垃圾回收机制与普通字符串有何不同?这个问题可能与stackoverflow.com/questions/372547有关另请参阅stackoverflow.com/questions/18152560/String.intern()管理内部的本机实现的池,该池具有一些...

weixin_42347882的博客 1236

Java程序员,不要过度依赖于String

   在Java中永远,永远不要过度使用String    我想标题可能会引进部分人的不满,抑或作者带着强烈的个人色彩,但是如果你能认真读完全文,我想你会有新的收获。    永远也不要使用(非包装类型)的String、long、int,那些原始类型没有语义,这样的变量类型很难理解、维护麻烦、而且不易扩展,接下来看一个简单的例子-----关于电影票的服务    在看这个例子之前要...

我的成长之路 http://foofish.net 172

Java中String的解读

在使用Java进行开发时,用到最多的类莫过于String对象了,在jdk1.8之前,其内部使用了char数组来保存字符串信息。到了jdk1.9之后又变成了byte数组。 根据上图所知,String类是final修饰的保证了其不可继承,且不可变的,因此它是线程安全的,其中value数组就是用来保存String的值信息的,而hash值主要用于在HashMap中生成Key的。 1,字符串常量池StringPool 在开发中,我们大量的使用了字符串,官方为了提升性能,减少内存占用,就在引入了字符串常量池的概念,相

程序员吗? 363

String在Java中存储

目录 总结: 1、中文怎么存储? 2、字符串存储 3、String、StringBuffer、StringBuilder 4、类与接口的区别 中文怎么存储? 什么时候char型不能存储汉字? char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字...

JasonChen3318的博客 734
上一篇: 多线程(三)线程控制之线程优先级
下一篇: java编程思想读书笔记----线程组的控制
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值