java 好码

1【强制】不要在 foreach 循环里进行元素的 remove/add 操作。

remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁。

正例:

List<String> list = new ArrayList<>();

list.add("1");list.add("2");

Iterator<String> iterator = list.iterator();

while (iterator.hasNext()) {

String item = iterator.next();

if (删除元素的条件) {

iterator.remove();

}

}

反例: for (String item : list) {

if ("1".equals(item)) {

list.remove(item);

}

}

2【强制】Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。

正例:"test".equals(object);

反例:object.equals("test");

3 【推荐】循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展

正例:

StringBuilder sb = new StringBuilder("start");

for (int i = 0; i < 100; i++) {

sb.append("hello");

}

String result = sb.toString();

这样可以避免在循环中创建过多的临时字符串对象,提高了性能和节省了内存。

如果是在多线程环境下进行字符串操作,可以考虑使用 StringBuffer,它与 StringBuilder 类似,但是线程安全的。

总之,使用 StringBuilderStringBufferappend 方法来处理循环内的字符串连接可以提高性能、降低内存消耗。

4【强制】创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。

正例:

public class TimerTaskThread extends Thread {

public TimerTaskThread() {

super.setName("TimerTaskThread");

...

}

}

5【参考】volatile 解决多线程内存不可见问题。对于一写多读,是可以解决变量同步问题, 但是如果多写,同样无法解决线程安全问题。如果是 count++操作,使用如下类实现: AtomicInteger count = new AtomicInteger(); count.addAndGet(1); 如果是 JDK8,推 荐使用 LongAdder 对象,比 AtomicLong 性能更好(减少乐观锁的重试次数)。

【推荐】表达异常的分支时,少用 if-else 方式,这种方式可以改写成:

if (condition) {

... return obj;

}

// 接着写 else 的业务逻辑代码;

说明:如果非得使用 if()...else if()...else...方式表达逻辑,【强制】避免后续代码维 护困难,请勿超过 3 层。

正例:超过 3 层的 if-else 的逻辑判断代码可以使用卫语句、策略模式、状态模式等来实现,

其中卫语句示例如下:

public void today() {

if (isBusy()) {

System.out.println(“change time.”);

return;

}

if (isFree()) {

System.out.println(“go to travel.”);

return;

}

System.out.println(“stay at home to learn Alibaba Java Coding Guidelines.”);

return;

}

6【强制】注意 Math.random() 这个方法返回是 double 类型,注意取值的范围 0≤x<1(能够 取到零值,注意除零异常),如果想获取整数类型的随机数,不要将 x 放大 10 的若干倍然后 取整,直接使用 Random 对象的 nextInt 或者 nextLong 方法。

7. 【强制】获取当前毫秒数 System.currentTimeMillis(); 而不是 new Date().getTime(); 说明:如果想获取更加精确的纳秒级时间值,使用 System.nanoTime()的方式。在 JDK8 中, 针对统计时间等场景,推荐使用 Instant 类。

8 你提到的情况是Java中String类的split方法的一个常见陷阱。split方法用正则表达式作为分隔符来分割字符串,并返回一个字符串数组。但是,如果输入字符串的末尾有分隔符,那么根据split方法的实现,这些末尾的空字符串可能不会被包含在结果数组中。

例如,你给出的代码:

javaCopy Code

String str = "a,b,c,,";

String[] ary = str.split(",");

System.out.println(ary.length);

输出的结果是3,而不是预期的5,因为split方法默认会丢弃末尾的空字符串。如果你想要包含这些空字符串,你需要使用split方法的另一个版本,它接受一个第二个参数,这个参数是一个整数,表示应该应用模式的次数。如果这个参数是负数,那么模式将会被应用尽可能多的次数,并且数组可以有任意长度,末尾的空字符串也会被包括在内。

修改后的代码如下:

javaCopy Code

String str = "a,b,c,,";

String[] ary = str.split(",", -1);

System.out.println(ary.length);

正例:

StringUtils.split(propertyName, ".")

//StringUtils.split 方法
 public static String[] split(String str, String separatorChars) {
        return splitWorker(str, separatorChars, -1, false);
    }

这时输出的结果将是5,因为设置了-1split方法会保留所有的分隔符后面的空字符串。

当使用split方法时,如果你需要访问数组中特定的索引,确保先检查数组的长度,以避免IndexOutOfBoundsException异常。例如:

javaCopy Code

if (ary.length > 3) {

String someValue = ary[3]; // 安全访问,因为已经检查了数组长度 } else { // 处理数组长度不足的情况

}

这样的检查可以确保即使数组没有你期望的那么多元素,你的代码也不会抛出异常。

9【推荐】setter 方法中,参数名称与类成员变量名称一致,this.成员名 = 参数名。在 getter/setter 方法中,不要增加业务逻辑,增加排查问题的难度。

反例:

public Integer getData() {

if (condition) {

return this.data + 100;

} else {

return this.data - 100;

}

}

10 在设计接口时,为了避免对已有代码造成影响,不应该修改已经在使用的接口的方法签名。这样可以保持向后兼容性,并确保接口调用方的代码不需要修改。

当一个接口过时时,添加@Deprecated注解是一种良好的做法。通过@Deprecated注解,我们可以明确地将过时的方法标记出来,并提供一些额外的信息,例如推荐使用的新接口或服务。

下面是一个示例:

 

javaCopy Code

public interface MyInterface {

/** * @deprecated This method is deprecated. Use the newMethod() instead. */ @Deprecated

void deprecatedMethod();

void newMethod();

}

在上述示例中,我们在deprecatedMethod()方法上添加了@Deprecated注解,并通过注释明确说明该方法已经过时,推荐使用newMethod()方法作为替代。

通过这样的做法,我们能够清楚地向接口调用方传达关于过时方法的信息,并提供他们使用替代方法的建议。这样可以减少对接口调用方的影响,并帮助他们平稳地迁移到新的接口或服务上。

总结起来,确保遵循接口设计原则,尽量避免修改已有接口的方法签名,而对于过时的接口,使用@Deprecated注解并提供相关信息是一种良好的做法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/210210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity 2d 入门 飞翔小鸟 Cinemachine 记录分数(十二)

1、创建文本 右键->create->ui->leagcy->text 2、设置字体 3、设置默认值和数字 4、当切换分辨率&#xff0c;分数不见问题 拖拽这里调整 调整到如下图 5、编写得分脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; …

Docker网络架构介绍

本文主要介绍了Docker容器的单机网络架构与集群网络架构&#xff0c;辅以演示&#xff0c;并简单介绍了网络管理中的命令。 前文&#xff1a; Docker的安装与简单操作命令-CSDN博客 docker网络原理介绍 与ovs类似&#xff0c;docker容器采用veth-pair linux bridge (虚拟交…

mysql语句练习

1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数 SELECT student.*,s1.s_score,s2.s_score FROM student,score s1,score s2 WHERE student.s_ids1.s_id AND student.s_ids2.s_id AND s1.c_id01 AND s2.c_id02 AND s1.s_score>s2.s_score 2、…

0007Java程序设计-ssm基于微信小程序的在线考试系统

文章目录 **摘要**目 录系统实现开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘要 网络技术的快速发展给各行各业带来了很大的突破&#xff0c;也给各行各业提供了一种新的管理技术&#xff0c;基于微信小程序的在线考试…

Linux下apisix离线安装教程

Linux下apisix离线安装教程 一、首先需要安装etcd&#xff1a;二、通过rpm离线安装apisix三、启动apisix四、安装apisix-dashboard1、安装2、更改dashboard登录账号名和密码3、运行 一、首先需要安装etcd&#xff1a; 解压缩etcd后执行以下命令&#xff1a; tar -xvf etcd-v3.…

C#注册表技术及操作

目录 一、注册表基础 1.Registry和RegistryKey类 &#xff08;1&#xff09;Registry类 &#xff08;2&#xff09;RegistryKey类 二、在C#中操作注册表 1.读取注册表中的信息 &#xff08;1&#xff09;OpenSubKey()方法 &#xff08;2&#xff09;GetSubKeyNames()…

内外联动——记建行江门鹤山支行营业部堵截一起新型骗局

建设银行广东省江门市分行&#xff08;以下简称“江门建行”&#xff09;认真贯彻落实党中央、国务院决策部署&#xff0c;紧紧围绕当地市委工作部署和上级行要求&#xff0c;扛牢国有大行责任&#xff0c;坚守金融工作的政治性、人民性&#xff0c;以深化新金融行动助力江门全…

javascript实现List列表数据结构

书籍推荐 有幸拜读《数据结构与算法Javascript描述》这本书&#xff0c;先强烈安利一波&#xff01;非常感谢作者大大给我们前端领域带来这本书。 全书从javascript的角度出发&#xff0c;简单明了的分析了数据结构在javascript领域的实现过程与实际的应用案例&#xff0c;且…

postgres 登录及常用命令

登陆 输入以下命令&#xff0c;尝试登录psql: psql -U postgres 报告以下错误&#xff1a; psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: Peer authentication failed for user "postgres" 换成下面…

Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

报错&#xff1a; OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performan…

差异计算基础知识 - 了解期末业务操作、WIP 和差异

原文地址&#xff1a;Basics of variance calculation-Understanding Period End activities, WIP and Variances | SAP Blogs 大家好&#xff0c; 这是我在成本核算方面的第六份文件&#xff0c;旨在解释期末的差异计算和相关活动。 我将引导您完成期末活动和差异计算。在本文…

MySQL char 尾随空格丢失与右侧空格填充

今天看《高性能MySQL(第四版)》,讲char,varchar时说“当存储CHAR值时&#xff0c;MySQL删除所有尾随空格。如果需要进行比较&#xff0c;值会用空格填充。”感觉这两句话有冲突啊&#xff0c;便研究了下。 对于具体的问题&#xff0c;当然官方文档是最好的&#xff0c;The CHAR…

【性能测试】Jmeter 配置元件(一):计数器

Jmeter 配置元件&#xff08;一&#xff09;&#xff1a;计数器 在 Jmeter 中&#xff0c;通过函数 ${__counter(,)} 可以实现每次加 1 1 1 的计数效果。但如果步长不为 1 1 1&#xff0c;则要利用到我们的计数器。 函数作用${__counter(,)}计数器&#xff0c;每次加 1${__d…

vue父子组件传值

父组件向子组件传值 1.在父组件中调用子组件时&#xff0c;定义要传递的参数 //使用子组件&#xff0c;并传递value作为prop<childComponent :childValue"parentValue"></childComponent>// 父组件的data中定义传递的参数data() {return {parentValue: &…

论文导读|10月MSOM文章精选:智慧医疗

编者按 在“10月MSOM文章精选&#xff1a;智慧医疗”中&#xff0c;我们有主题、有针对性地选择了MSOM期刊杂志中一些有关智慧医疗领域的有趣文章&#xff0c;不但对文章的内容进行了概括与点评&#xff0c;而且也对文章的结构进行了梳理&#xff0c;旨在激发广大读者的阅读兴趣…

c++--面向对象特性

1.面向对象指的是继承&#xff0c;封装&#xff0c;多态。 继承主要关注类的构造&#xff0c;赋值&#xff0c;析构。 以下对多态&#xff0c;封装进行补充说明。 2、多态 2.1.定义 a.赋值 派生类的指针&#xff0c;可以赋值给基类的指针。 派送类的对象&#xff0c;可以赋值给…

教师需要什么技能?

作为一名老师&#xff0c;需要掌握许多技能&#xff0c;以便能够成功地教育和指导学生。以下是一些关键技能&#xff1a; 1.教学技能&#xff1a;老师需要有深入的学科知识和教学经验&#xff0c;以便能够有效地传授知识。教师应该了解如何设计和执行教学计划&#xff0c;制定课…

【Java基础篇 | 面向对象】—— 聊聊什么是接口(下篇)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 上篇&#xff08;【Ja…

SpringBoot 自动装配原理详解

什么是 SpringBoot 自动装配&#xff1f; 我们现在提到自动装配的时候&#xff0c;一般会和 Spring Boot 联系在一起。但是&#xff0c;实际上 Spring Framework 早就实现了这个功能。Spring Boot 只是在其基础上&#xff0c;通过 SPI 的方式&#xff0c;做了进一步优化。 Spr…

解决npm install时报:gyp ERR! configure error

报错内容&#xff1a; npm ERR! gyp ERR! cwd C:\Users\zccbbg\code\my\examvue\node_modules\node-sass npm ERR! gyp ERR! node -v v16.13.1 npm ERR! gyp ERR! node-gyp -v v3.8.0 npm ERR! gyp ERR! not ok npm ERR! Build failed with error code: 1 解决办法&#xff1a;…