Java 代码质量
被滥用的instanceof
instanceof滥用, 或者直接强转, 大都数情况可以用方法override, 而且应当避免使用isA(), isB()之类的写法;
比如sonA和sonB都继承自parent, 其中sonA和sonB想对parent里方法move()各自拥有独立的实现;
// 错误写法1
void test(parent p) {
if (p instanceof sonA) {
((sonA) p).moveA();
} else if (p instanceof sonB) {
((sonB) p).moveB();
}
}
// 错误写法2
void test2(parent p) {
if (p.isA()) {
((sonA) p).moveA();
} else if (p.isB()) {
((sonB) p).moveB();
}
} // 正确写法
void test3(parent p) {
// sonA sonB里做不同的实现.
p.move();
}
那么正确写法是在sonA和sonB中都重新实现move()来实现差异, 而不是在parent.move()里用instanceof sonA.
最终代码中不应该出现if else, 而是只有一个parent.move()方法.
性能
尽量不要在方法上加synchronized, 会阻塞每一个调用方法的对象.
应该在方法块里, 并且要缩小控制粒度.
// 错误写法一
public synchronized Form getFormFromCache(String bookPath) {
// 错误写法二, 粒度太大, 应该把get提取出来做双重检查
public Form getFormFromCache(String bookPath) {
FormEntry entry;
synchronized (formCache) {
entry = formCache.get(bookPath);
if (entry == null) {
entry = new FormEntry(bookPath);
formCache.put(bookPath, entry);
}
}
}
// 正确写法, 虽然有点繁琐, 但是性能好
public Form getFormFromCache(String bookPath) {
FormEntry entry = formCache.get(bookPath);
if (entry == null) {
synchronized (formCache) {
entry = formCache.get(bookPath);
if (entry == null) {
entry = new FormEntry(bookPath);
formCache.put(bookPath, entry);
}
}
}
}
变量与状态
对于不同状态不同实现的时候, 可以使用enum来替代int, 在enum内部做不同实现, 而不是一堆switch (state) .
public方法尽量不要用boolean入参, 尤其多个参数的时候, 会让调用者很困惑.
// 错误一
public void doSth(boolean isXX){
if (isXX) {
//...
} //...
} // 正确: 拆分方法, 公共部分可以抽成private
public void doSth(){
//...
} public void doXX() {
//..
} // 错误二
public void doSth2(boolean isHorizon){ } // 正确使用int或者enum来标记参数, 而不是isHorizon
public void doSth3(int align){ }
精简代码逻辑
多余的if else
if(condition) {
return true;
}
return false; //改成直接return condition就行了.
繁琐的逻辑
1 if (0 <= b && b <= 1) {
return b;
} else {
return b < 0 ? 0 : 1;
}
//改成Math.min(Math.max(0, b), 1);
不要return null
尽量用一个空对象来描述, 而不是null. 避免外部调用的时候发生NPE.
// 错误写法
public TestNull doWrong() {
if (true) {
return null;
} return new TestNull();
} //正确写法
public TestNull doRight() {
if (true) {
return TestNull.EMPTY;
} return new TestNull();
} static class TestNull { private static TestNull EMPTY = new TestNull(); }
Java 代码质量的更多相关文章
- 拔高你的Java代码质量吧:推荐使用枚举定义常量(转)
提高你的Java代码质量吧:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一 ...
- 提高Java代码质量的Eclipse插件之Checkstyle的使用详解
提高Java代码质量的Eclipse插件之Checkstyle的使用详解 CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具.它能够自动化代 ...
- 提高Java代码质量的Eclipse插件之Checkstyle的使用具体解释
CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发者遵守某些编码规范的工具.它可以自己主动化代码规范检查过程.从而使得开发者从这项重要可是枯燥的任务中解脱出来. Ch ...
- Java代码质量监控工具Sonar安装
1. 代码质量七宗罪 Sonar是一个代码质量管理系统.它的帮助文档开篇明义,提出了代码质量的七宗罪.总结的比較到位.最好还是一看: 1. Bug和隐藏Bug(Bugs and Pot ...
- Java代码质量度量工具大阅兵
FindBugs FindBugs, a program which uses static analysis to look for bugs in Java code. It is free so ...
- 提升Java代码质量(三)
Item7:覆盖equals时需要遵守通用约定 在我们日常开发过程中,重写equals是比较常用的,但存在许多不合适的覆盖方式导致错误,最好的避免方法就是不去重写equals.但有时我们的业务又需要建 ...
- 提高Java代码质量:使用枚举定义常量(转)
一.分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一种常量声明方式,枚举常量.代码如下: enum ...
- 推荐个Java代码质量检测的利器 —— FindBugs
一.下载 插件的下载地址(sourceforge):FindBugs-Eclipse插件 二.安装 Eclipse插件的安装,就不多说了. 三.使用 1.找一个Project,选中它(也可以针对某个P ...
- 提高你的Java代码质量吧:少用静态导入
一.分析 从Java 5开始引入静态导入语法(import static),其目的是为了减少字符输入量,提高代码的可阅读性,以便更好地理解程序. 但是,滥用静态导入会使程序更难阅读,更难维护.静态导 ...
- 提高你的Java代码质量吧:如果有必要,使用变长数组吧
一.分析 Java中的数组是定长的,一旦经过初始化声明就不可改变长度,这在实际使用中非常不方便. 二.场景 比如要对班级学生的信息进行统计,因为我们不知道一个班级会有多少学生(随时都有可能会有学生 ...
随机推荐
- Muduo阅读笔记--base(二)
上一篇文章对muduo的入门做了介绍. http://www.cnblogs.com/LCCRNblog/p/5668035.html base文件夹下这么多代码,该如何入手呢?对于我这种第一次接触大 ...
- zepto在操作dom的selected和checked属性时尽量使用prop方法
zepto在操作dom的selected和checked属性时尽量使用prop方法.
- 检测CSS属性 是否支持
原理是:创建一个节点,判断其的style属性是否含有textOverflow属性,有则进一步判断是否支持ellipsis这个值.当遇到不支持的属性值时,浏览器会直接把这个值抛弃.因此这里就可以先给te ...
- 前端基于react,后端基于.net core2.0的开发之路(2) 开发环境的配置,注意事项,后端数据初始化
前端环境配置 项目介绍文章:前端基于react,后端基于.net core2.0的开发之路(1) 介绍 1.VSCode安装 下载地址:https://code.visualstudio.com/Do ...
- java非阻塞IO(NIO)流程
单线程 多线程(Netty/Mina)
- c#中的Out, params,ref 细说并沉淀
1. Out,params,ref之前先记录平时用的最多的按值传递参数的情况,当然默认情况下参数传入函数的默认行为也是按值传递的. 1: //默认情况下参数会按照值传递 2: static int a ...
- MySQL中Left Join和Right Join的理解
虽然之前一直见过两个Join,对于其具体的含义也在参考书上读过,但是一直没有记住.现在换一种方式进行学习,改为实验方式理解. Left Join 测试表: 表结构很简单,test包括两个int字段,t ...
- [转]oracle系统表v$session、v$sql字段说明
在本视图中,每一个连接到数据库实例中的 session都拥有一条记录.包括用户 session及后台进程如 DBWR, LGWR, arcchiver等等. V$SESSION中的常用列 V$SESS ...
- 以太网接口芯片W5300使用说明
一.芯片简介 引用百度百科对芯片的一个简介,我就不再赘述. W5300的目标是在高性能的嵌入式领域,如多媒体数据流服务.与WIZnet现有的芯片方案相比较,W5300在内存空间和数据处理能力等方面都有 ...
- ASP.NET Core 认证与授权[5]:初识授权
经过前面几章的姗姗学步,我们了解了在 ASP.NET Core 中是如何认证的,终于来到了授权阶段.在认证阶段我们通过用户令牌获取到用户的Claims,而授权便是对这些的Claims的验证,如:是否拥 ...