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中的数组是定长的,一旦经过初始化声明就不可改变长度,这在实际使用中非常不方便. 二.场景 比如要对班级学生的信息进行统计,因为我们不知道一个班级会有多少学生(随时都有可能会有学生 ...
随机推荐
- J - Scarily interesting! URAL - 2021
This year at Monsters University it is decided to arrange Scare Games. At the Games all campus gathe ...
- jquery操作html小技巧
1.隐藏table整列 $("#tableID tr").find('td:eq(N)').hide();
- CSS系列------选择器和选择器的优先级
1.1.基本选择器 通配符选择器(*) 通配符选择器的使用方法如下 *{margin:0px; padding:0px;} //*代表所有的 ID选择器(#) ID选择器的使用方式如下: * ...
- ML技术 - 特征选择
1. 决策树中的特征选择 分类决策树是一种描述对实例进行分类的树型结构,决策树学习本质上就是从训练数据集中归纳出一组分类规则,而二叉决策树类似于if-else规则.决策树的构建也是非常的简单,首先依据 ...
- 一:配置使用阿里云Maven库
鉴于国内的网络环境,从默认 Maven 库下载 jar 包是非常的痛苦. 速度慢就不说了,还经常是下不下来,然后一运行就是各种 ClassNotFoundException,然后你得找到残留文件删掉重 ...
- Makefile持续学习二
Makefile概述 一.Makefile里有什么? Makefile里主要包含5个东西:显式规则.隐晦规则.变量定义.文件指示和注释 1.显式规则:显式规则说明如恶化生成一个或多的目标文件,包含要生 ...
- Python之re模块(结合具体业务)
1.判断数据库名是否合法 import re dbname = "test_" result = re.match("[a-zA-Z_0-9]{1,}$",db ...
- C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模 ...
- [最短路]P1339 [USACO09OCT]热浪Heat Wave
题目描述 The good folks in Texas are having a heatwave this summer. Their Texas Longhorn cows make for g ...
- HTML基础下
知识点一: HTML5的标准结构: <!DOCTYPE html> <html lang='en'> <head> <meat charset='utf-8' ...