被滥用的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 代码质量的更多相关文章

  1. 拔高你的Java代码质量吧:推荐使用枚举定义常量(转)

    提高你的Java代码质量吧:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一 ...

  2. 提高Java代码质量的Eclipse插件之Checkstyle的使用详解

    提高Java代码质量的Eclipse插件之Checkstyle的使用详解 CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具.它能够自动化代 ...

  3. 提高Java代码质量的Eclipse插件之Checkstyle的使用具体解释

    CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发者遵守某些编码规范的工具.它可以自己主动化代码规范检查过程.从而使得开发者从这项重要可是枯燥的任务中解脱出来. Ch ...

  4. Java代码质量监控工具Sonar安装

    1.  代码质量七宗罪 Sonar是一个代码质量管理系统.它的帮助文档开篇明义,提出了代码质量的七宗罪.总结的比較到位.最好还是一看: 1.        Bug和隐藏Bug(Bugs and Pot ...

  5. Java代码质量度量工具大阅兵

    FindBugs FindBugs, a program which uses static analysis to look for bugs in Java code. It is free so ...

  6. 提升Java代码质量(三)

    Item7:覆盖equals时需要遵守通用约定 在我们日常开发过程中,重写equals是比较常用的,但存在许多不合适的覆盖方式导致错误,最好的避免方法就是不去重写equals.但有时我们的业务又需要建 ...

  7. 提高Java代码质量:使用枚举定义常量(转)

    一.分析  常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一种常量声明方式,枚举常量.代码如下: enum ...

  8. 推荐个Java代码质量检测的利器 —— FindBugs

    一.下载 插件的下载地址(sourceforge):FindBugs-Eclipse插件 二.安装 Eclipse插件的安装,就不多说了. 三.使用 1.找一个Project,选中它(也可以针对某个P ...

  9. 提高你的Java代码质量吧:少用静态导入

    一.分析  从Java 5开始引入静态导入语法(import static),其目的是为了减少字符输入量,提高代码的可阅读性,以便更好地理解程序. 但是,滥用静态导入会使程序更难阅读,更难维护.静态导 ...

  10. 提高你的Java代码质量吧:如果有必要,使用变长数组吧

    一.分析  Java中的数组是定长的,一旦经过初始化声明就不可改变长度,这在实际使用中非常不方便. 二.场景  比如要对班级学生的信息进行统计,因为我们不知道一个班级会有多少学生(随时都有可能会有学生 ...

随机推荐

  1. Jquery datatable中文排序问题

    先扩展datatable的的排序功能,添加一个自定义排序函数 //为jq datatable 自定义中文排序 jQuery.fn.dataTableExt.oSort['chinese-sort-as ...

  2. transform的影响

    http://www.cnblogs.com/chuangweili/p/5167986.html transform 各种影响 1.提升元素的z-index层级,下面这个例子会让前面的图片显示在上面 ...

  3. Problem F: 合唱比赛开始了!

    Problem F: 合唱比赛开始了! Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 440  Solved: 201[Submit][Status][ ...

  4. J1002.JavaFX简介

    引言 2008年12月05日,SUN发布了JavaFX第一个正式版本,以期望Java在UI端能够更好地应用于开发富客户端的互联网应用(Rich Internet Cliet). 2011年发布的Jav ...

  5. Python程序员去上海工作有多难?

    我只能说,也要看你掌握的技术可以打多少分.技术熟练度跟找工作的难易程度是成正比的:你掌握得越好,找工作就越容易(难度系数越低):反之越高. Python程序员这种技术类的工作岗位,当然还是要有扎实的技 ...

  6. requests和BeautifulSoup

    一:Requests库 Requests is an elegant and simple HTTP library for Python, built for human beings. 1.安装 ...

  7. 【Win 10 应用开发】UI Composition 札记(六):动画

    动画在 XAML 中也有,而且基本上与 WPF 中的用法一样.不过,在 UWP 中,动画还有一种表现方式—— 通过 UI Composition 来创建. 基于 UI Composition 的动画, ...

  8. springMVC初探

    MVC框架要做哪些事情? a,将url映射到java类,或者java类的方法上 b,封装用户提交的数据 c,处理请求->调用相关的业务处理—>封装响应的数据 d,将响应的数据进行渲染 sp ...

  9. 微信小程序开发《三》:微信小程序请求不能使用session的原因及解决办法

    本人在前面的微信小程序开发<二>中提到要想在服务端保持状态需要在客户端第一次请求服务器的时候给客户端返回一个sessionid,由客户端在本地保存,下次请求的时候在header里面带上这个 ...

  10. [拓扑排序]Ordering Tasks UVA - 10305

    拓扑排序模版题型: John has n tasks to do.Unfortunately, the tasks are not independent and the execution of o ...