Java 代码质量

被滥用的instanceof

instanceof滥用, 或者直接强转, 大都数情况可以用方法override, 而且应当避免使用isA(), isB()之类的写法;

比如sonA和sonB都继承自parent, 其中sonA和sonB想对parent里方法move()各自拥有独立的实现; 

 1 // 错误写法1
 2 void test(parent p) {
 3     if (p instanceof sonA) {
 4         ((sonA) p).moveA();
 5     } else if (p instanceof sonB) {
 6         ((sonB) p).moveB();
 7     }
 8 }
 9 // 错误写法2
10 void test2(parent p) {
11     if (p.isA()) {
12         ((sonA) p).moveA();
13     } else if (p.isB()) {
14         ((sonB) p).moveB();
15     }
16 }
17 
18 // 正确写法
19 void test3(parent p) {
20     // sonA sonB里做不同的实现.
21     p.move();
22 }

那么正确写法是在sonA和sonB中都重新实现move()来实现差异, 而不是在parent.move()里用instanceof sonA.

最终代码中不应该出现if else, 而是只有一个parent.move()方法.

性能 

尽量不要在方法上加synchronized, 会阻塞每一个调用方法的对象.

应该在方法块里, 并且要缩小控制粒度.

1     // 错误写法一
2     public synchronized Form getFormFromCache(String bookPath) {
 1     // 错误写法二, 粒度太大, 应该把get提取出来做双重检查
 2     public Form getFormFromCache(String bookPath) {
 3         FormEntry entry;
 4         synchronized (formCache) {
 5             entry = formCache.get(bookPath);
 6             if (entry == null) {
 7                 entry = new FormEntry(bookPath);
 8                 formCache.put(bookPath, entry);
 9             }
10         }
11     }
 1     // 正确写法, 虽然有点繁琐, 但是性能好
 2     public Form getFormFromCache(String bookPath) {
 3         FormEntry entry = formCache.get(bookPath);
 4         if (entry == null) {
 5             synchronized (formCache) {
 6                 entry = formCache.get(bookPath);
 7                 if (entry == null) {
 8                     entry = new FormEntry(bookPath);
 9                     formCache.put(bookPath, entry);
10                 }
11             }
12         }
13     }

变量与状态

对于不同状态不同实现的时候, 可以使用enum来替代int, 在enum内部做不同实现, 而不是一堆switch (state) .

public方法尽量不要用boolean入参, 尤其多个参数的时候, 会让调用者很困惑.

 1     // 错误一
 2     public void doSth(boolean isXX){
 3         if (isXX) {
 4             //...
 5         }
 6 
 7         //...
 8     }
 9 
10     // 正确: 拆分方法, 公共部分可以抽成private
11     public void doSth(){
12         //...
13     }
14 
15     public void doXX() {
16         //..
17     }
18 
19     // 错误二
20     public void doSth2(boolean isHorizon){
21 
22     }
23 
24     // 正确使用int或者enum来标记参数, 而不是isHorizon
25     public void doSth3(int align){
26 
27     }

 精简代码逻辑

 多余的if else

1 if(condition) {
2     return true;
3 }
4 return false;
5  
6 //改成直接return condition就行了.

繁琐的逻辑

1 if (0 <= b && b <= 1) {
2   return b;
3 } else {
4    return b < 0 ? 0 : 1;
5 }
6 //改成Math.min(Math.max(0, b), 1);

不要return null

尽量用一个空对象来描述, 而不是null. 避免外部调用的时候发生NPE.

 1     // 错误写法
 2     public TestNull doWrong() {
 3         if (true) {
 4             return null;
 5         }
 6 
 7         return new TestNull();
 8     }
 9 
10     //正确写法
11     public TestNull doRight() {
12         if (true) {
13             return TestNull.EMPTY;
14         }
15 
16         return new TestNull();
17     }
18 
19     static class TestNull {
20 
21         private static TestNull EMPTY = new TestNull();
22 
23     }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

Groovy&Java动态编译执行

工作中,遇到部分业务经常动态变化,或者在不发布系统的前提下,对业务规则进行调整。那么可以将这部分业务逻辑改写成Groovy脚本来执行,那么就可以在业务运行过程中...

60020
来自专栏丑胖侠

《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法

RHS语法 使用说明 RHS是满足LHS条件之后进行后续处理部分的统称,该部分包含要执行的操作的列表信息。RHS主要用于处理结果,因此不建议在此部分再进行业务判...

29680
来自专栏精讲JAVA

Java 虚拟机 4:内存溢出

Java堆唯一的作用就是存储对象实例,只要保证不断创建对象并且对象不被回收,那么对象数量达到最大堆容量限制后就会产生内存溢出异常了。所以测试的时候把堆的大小固定...

10320
来自专栏吴老师移动开发

[Flutter]请求阿里百川的API

简单封装了一下,请求阿里百川的api。只是做了一个简单的get请求封装,要更加优雅可以自己再封装一下。

45740
来自专栏逍遥剑客的游戏开发

UE4学习笔记: Gameplay Classes

29070
来自专栏ASP.NETCore

动手实现扩展属性为对象动态添加获取数据(续)

在上一篇文章中我们了解了扩展属性的原理和结构,其实其内部结构与思想都与WPF中的依赖属性基本相同,大家也可以从中了解到关于依赖属性的原理,这对了解及使用依赖属性...

14110
来自专栏腾讯Bugly的专栏

Android JNI出坑指南

笔者结合自身经验、网上资料对 JNI 的坑进行总结,如果有不正确或遗漏之处欢迎指出。

83270
来自专栏步履前行

Java Stream distinct

  在使用Java Stream 进行过滤的时候,比如有一个User 类,然后有 type字段,我们想去除的话,用传统的语法来操作是比较麻烦的,比如可以Map<...

73620
来自专栏Java帮帮-微信公众号-技术文章全总结

Java设计模式-组合模式

组合模式: 将对象组合成树形结构以表示‘部分-整体’的层次结构, 使得用户对单个对象和组合对象的使用具有一致性. 解析 组合模式描述了如何将容器和叶子节点进行...

38560
来自专栏Ryan Miao

java中byte, iso-8859-1, UTF-8,乱码的根源

Post@https://ryan-miao.github.io 测试代码https://github.com/Ryan-Miao/someTest/comm...

70970

扫码关注云+社区

领取腾讯云代金券