被滥用的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. 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest J Cleaner Robot

    Cleaner RobotCrawling in process... Crawling failed Time Limit:2000MS     Memory Limit:524288KB     ...

  2. SQLAlchemy复杂查询

    最近个人用python + flask搞了一个小项目,ORM用到的是SQLAlchemy.   SQLAlchemy的查询方式非常灵活,你所能想像到的复杂SQL 语句,基本上都可以实现.这里简单的总结 ...

  3. L2-2. 链表去重

    L2-2. 链表去重 时间限制300 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者陈越给定一个带整数键值的单链表L,本题要求你编写程序,删除那些键值的绝对值有重复的 ...

  4. ligerUI---ligerGrid中treegrid(表格树)的使用

    写在前面: 表格树是在普通ligerGrid的基础上,做了一点改变,使数据以表格树的形式显示出来,适用于有级别的数据比如菜单(有父菜单,父菜单下面有子菜单).表格树的显示有两种方法,可以根据自己的项目 ...

  5. zabbix 3.2 高可用实现方式二-pacemaker+corosync实现zabbix高可用集群

    一.pacemaker 是什么 1.pacemaker 简单说明 2.pacemaker 由来 二.pacemaker 特点 三.pacemaker 内部结构 1.群集组件说明: 2.功能概述 四.c ...

  6. mybatis映射异常

    今天写项目突然遇到了这么个问题:  nested exception is org.apache.ibatis.reflection.ReflectionException: There is no  ...

  7. 学习笔记-----php搭建用户管理系统

    后台:php,数据库:mysql,前端:html,css,js; 主要页面介绍: 1.php连接数据库后台,读取数据并将其以表格的形式显示,并且有添加,编辑,删除,分页等功能: 2.php用于添加用户 ...

  8. 如何编写通用的 Helper Class

    Github: https://github.com/nzbin/snack-helper Docs: https://nzbin.github.io/snack-helper 前言 什么是 help ...

  9. javaScript函数提升及作用域

    代码片段: var a = 1; function foo() { console.log(a); //输出为undefined if (!a) { var a = 2; } alert(a); }; ...

  10. [转载] 基于Redis实现分布式消息队列

    转载自http://www.linuxidc.com/Linux/2015-05/117661.htm 1.为什么需要消息队列?当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消 ...