【新京葡萄官方网站】编写高质量的代码基本要求
日期:2023-10-03 01:09 | 人气:
本文摘要:命名类、方法或字段的命名必须基本见名达意。
命名类、方法或字段的命名必须基本见名达意。如:过滤List
所以,需要有模块化和抽象思维,将大块的庞大逻辑提炼成类或函数,屏蔽细节。简朴来说就是,对庞大业务逻辑,主方法只处置惩罚主干,分枝由其他方法处置惩罚,以直观的方式体现主要流程。好比:null判断与处置惩罚方法如果方法可能返回null则,必须注解javax.annotation.Nullable或javax.annotation.CheckForNull。
(注:如果是实现类,则该注解必须注解在接口方法中,而不是详细实现类)作用1:明确接口可能会响应null,以便于开发人员更直观的认识接口。作用2:使用如IDEA inspections,Ali-Check,FindBugs,SonarLint等插件可以更好的辅助排查空指针问题。方法参数如果方法参数可吸收为null的参数,则必须注解javax.annotation.Nullable。
如果没有注解Nullable的参数默认一定是非null。如果切合上述规范的代码要求,可以简化对null判断的逻辑操作(基本无效操作,只是为了保证non-null。这是因为在以前的代码规范中,没有明确的表达某个接口是否会有null返回,需要假设所有的接口都有可能返回null,为了保证法式的结实性,需要在各个地方都举行non-null判断。
所以厥后泛起JAVA尺度jsr305来处置惩罚该问题)。简化null判断代码示例:流程处置惩罚在if,for,while, iterator等流程控制语法中,必须遵守最短路径原则。
即流程可竣事立刻竣事,以可短路的分支作为优先判断逻辑。作用:简化庞大逻辑、简化代码的条理嵌套,制止多次缩进,代码阅读时明白难题。示例:重构示例:if逻辑判断在使用if举行逻辑判断时,如果逻辑判断庞大,应该使用能表达逻辑判断语义的命名变量来表现。如:而不是直接使用:区别在于,检察代码的人员不需要分外的明白这个庞大的表达式所想表达的语义。
而是通过变量名可以先有直语的语义情况,促进对庞大表达式的阅读明白。建立荟萃类荟萃类的建立必须有明确或者有评估容量指定。作用:荟萃类在建立时都市有默认的容量巨细。
如ArrayList默认初始化容量为10(每次扩容为当前容量的1.5倍),HashMap的默认初始化容量为16(实际容量:16 * 0.75 = 12,即如果凌驾12会触发扩容,每次扩容为2倍容量)。如果放置的元素凌驾容量巨细,会触发扩容操作,而扩容操作是相对庞大的,需要:建立一个新的容量数组(申请内存)将旧的数据复制到新的数组(数据复制)这个历程是相对很是耗时的。
所以,建立荟萃类时建立切合预期容量巨细的容量,可以有效的淘汰扩容次数,提升性能。传参荟萃类List,Set,Map,工具在作为参数举行通报时,正常情况下克制对其举行修改。
除非很是明确该修改是切合预期的行为。克制修改原因:原始荟萃类建立的业务方法中,无法评估该荟萃是否发生了非预期行为的变化。好比:某数据被删除,新增了某个数据。
下游方法无得知该荟萃是否可变。同理,在工具的通报中,被挪用的方法内部也需要思量对工具的操作是否是切合上下文预期,切合方法预期的。相等符号 == 使用注意事项工具或类的相等性判断==是判断其引用地址是否相同。
如:Object a = new Object(); Object b = new Object(); a == b一定是false。所以,在使用==符号时必须明确的知道其在JVM中被赋予的功效。相同的,在数字相等性比力中,好比1 == 1,一定是true。
可是在JVM中有时候并不是这样的。如下代码:这是因为在JVM中,基础类型涉及到自动拆/装箱逻辑。在基础类型被需求为工具时都市举行装箱操作。
也就是说二者的相等性对比酿成了工具引用地址是否相同的比力。所以,上述代码中就酿成对比a和b,c和d的引用地址是否相同,而不是对比1 == 1和10086 == 10086的逻辑了。那么,为什么a与b引用地址相同,可是b与c的引用地址差别呢?这是因为Integer缓存了-128 ~ 127数值的工具。如果数字在这个规模内,返回的工具都是相同的。
(如果是逻辑运算,>、<等会触发基础类型的封装类型的自动拆箱操作,或者判断==的基础类型中某一方不是封装类型也会触发自动拆箱操作(如:int a=199,;Integer b = 199; a == b则不存在以上问题)同理,其他的基础类型也都有相同的缓存实现。(String不是基础类型)所以,通常情况下,二个工具是否相同的判断必须使用equals。
equals的使用常量必须在前。如"true".equals(isLaegal)建议使用:Objects.equals(a,b)线程池的使用线程池克制直接使用Executors建立。好比:Executors.newScheduledThreadPool(100);。其他建立一个corePoolSize=100焦点线程,可是默认的maximumPoolSize=Integer.MAX_VALUE。
如果使用不妥,会建立出凌驾预期的线程数量,聚集大量的请求,导致OOM。try catch finally克制在finally代码块中使用return语句。finally的执行逻辑是:在try代码块中遇到return,执行finally,finally执行完成,返回try代码块的return效果。
而如果在finally遇到return,则直接返回该return效果。不会返回try代码块的return效果。switch使用switch必须指定default。
如:制止在case中忘记写break,以及不存在任意匹配规则时的执行业务逻辑(即没有任何的case被掷中)。(强制原因:外洋友人因为没写break,而且没有default,导致了几亿美元的损失,厥后就成为该约定了)ThreadLocal使用ThreadLocal的原理决议了其元素在使用时可能存在逃逸问题。所以,在使用ThreadLocal时,必须明确的挪用remove方法。通常情况下,ThreadLocal是为在同一线程执行历程中会多次使用到的同一实例。
ThreadLocal正常需要在有一个全局的执行点执行remove操作。在使用ThreadLocal时,设计上必须思量如果remove的问题。阿里规范:必须接纳自界说的ThreadLocal变量,尤其在线程池场景下,线程经常会被复用,如果不清理自界说的 ThreadLocal变量,可能会影响后续业务逻辑和造成内存泄露等问题。
只管在署理中使用try-finally块举行接纳。正则表达式正则Pattern可以在相同的表达式中是线程宁静的,所以在使用正则表达式时,使用好其预编译功效,可以有效加速正则匹配速度。不要在方法体内界说:Pattern pattern = Pattern.compile(规则)。使用工具SonarLintSonarLint是相对比力全面的检测,可是无法检测编译好的类(编译好的需要使用FindBugs)主要分为三类陈诉:Blocker:对应严重的问题,原则上必须处置惩罚所有的Blocker陈诉。
如果不能处置惩罚必须写有原因注释,并标注@todo或者@fixme。Marjor:对应警告性信息,原则上需要处置惩罚。
部份不处置惩罚的,需要注解@SuppressWarnings。Minor:对应微弱警告性信息,原则上需要处置惩罚可处置惩罚的。Ali-CheckAliCheck主要分为三类陈诉:BLOCKER: 对应严重的问题,原则上必须处置惩罚。如果不能处置惩罚必须写有原因注释,并标注@todo或者@fixme。
CRITICAL: 对应警告性信息,原则上需要处置惩罚。部份不处置惩罚的,需要注解@SuppressWarnings。
MAJOR:对应微弱警告性信息,原则上需要处置惩罚可处置惩罚的。代码提交尺度任何人在代码提交之前,必须通过Ali-Check及SonarLint的双重检测尺度。
本文关键词:新京葡萄官网入口,新京葡萄官方网站
本文来源:新京葡萄官网入口-www.nicoledominique.com