Ali-Check 【Blocker】

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
Blocker

Blocker直译过来是“雏形锻模”的意思,大意应该是要给开发者提供一个开发的模板。它在Ali-Check中的提示等级是最高的,在Android Studio中也是红色的标记
Blocker Inspections包含代码规范(消除歧义,增强可读性),性能调优等检测,值得开发者去了解,并且处理该类型的Inspections。

如何查看Blocker

在安装了Ali-Check的插件以后,如果想查看Blocker中所有的检测内容,可以点击Android Studio 的“File→Settings”,然后如下图所示,筛选Ali-Check中的Blocker即可。

Blocker目录

Blocker Inspections

从上面目录可以了解到,目前总共有11条Blocker提示信息,下面会对每条Blocker进行简单的记录。


1. long或者Long初始赋值时,必须使用大写的L

long或者Long初始赋值时,必须使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。

  • Negative example:
     //It is hard to tell whether it is number 11 or Long 1.
     Long warn = 1l;
    
  • Positive example:
     Long notwarn = 1L;
    
  • 笔记
    这个Blocker很好理解,主要是为了提高代码的可读性,防止误导开发者。为了方便的看出long类型,有些时候小写的“l”还是有可能被误解成“1”的。

2.不要在foreach循环里进行元素的remove/add操作

不要在foreach循环里进行元素的remove/add操作,remove元素请使用Iterator方式。如果并发操作,需要对 Iterator 对象加锁。

  • Negative example
    List<String> originList = new ArrayList<String>();
    originList.add("22");
    for (String item : originList) { 
       //warn
       originList.add("bb");
    }  
    
  • Positive example
    Iterator<Integer> it=b.iterator();		 
    while(it.hasNext()){                      
       Integer temp =  it.next();             
       if (delCondition) {
           it.remove();
       }
    }
    
  • 笔记
    在foreach循环里面进行元素的remove/add操作,可能会导致程序异常崩溃。之前项目中有出现过异常。
    这篇文章有记录,不过根据文章步骤暂未复现。 不要在 foreach 循环里进行元素的 remove/add 操作

3. 在if/else/for/while/do语句中必须使用大括号

在if/else/for/while/do语句中必须使用大括号,即使只有一行代码,避免使用下面的形式:if (condition) statements;

  • Negative example
    if (flag) System.out.println("hello world");
    
  • Positive example
    if (flag) {
            System.out.println("hello world");
    }
    
  • 笔记
    主要是为了提高代码的可读性。单行省略括号,这样看起来比较“高端”,但是降低代码可读性。特别是
    多行的时候有多个else,之后如果修改代码,会令人头大,也有很大的几率改错。

4.在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。

在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。

  • Negative example
     public class XxxClass {
            public Pattern getNumberPattern() {
                // Avoid use Pattern.compile in method body.
                Pattern localPattern = Pattern.compile("[0-9]+");
                return localPattern;
            }
     }
    
  • Positive example
     public class XxxClass {
            // Use precompile
            private static Pattern NUMBER_PATTERN = Pattern.compile("[0-9]+");
    }
    
  • 笔记
    性能优化类的Blocker,提高程序运行的效率。

5.多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题。
  • Ali
    //org.apache.commons.lang3.concurrent.BasicThreadFactory
      ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,
          new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());
      executorService.scheduleAtFixedRate(new Runnable() {
          @Override
          public void run() {
              //do something
          }
      },initialDelay,period, TimeUnit.HOURS);
    
  • 笔记
    暂未遇到,不予记录

6.所有的包装类对象之间值的比较,全部使用equals方法比较。

所有的包装类对象之间值的比较,全部使用equals方法比较。
说明:对于Integer var=?在-128至127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。

  • Positive example

      Integer a = 235;
      Integer b = 235;
      if (a.equals(b)) {
          // code
      }
    
  • 笔记
    如果用“==”比较Integer类,在超过 [-128, 127]范围的时候就会失效,需要特别注意

  • 经典题

    Integer i1 = 1;
    Integer i2 = 1;
    Integer i3 = 128;
    Integer i4 = 128;
    Log.i("", ""+(i1 == i2));
    Log.i("", ""+(i1.equals(i2)));
    Log.i("", ""+(i3 == i4));     
    Log.i("", ""+(i3.equals(i4)));
    

    输出结果

    true,true,false,true
    

7.所有的覆写方法,必须加@Override注解。

所有的覆写方法,必须加@Override注解。

  • Negative example
    getObject()与get0bject()的问题。一个是字母的O,一个是数字的0,加@Override可以准确判断是否覆盖成功。另外,如果在抽象类中对方法签名进行修改,其实现类会马上编译报错。
  • 笔记
    这种继承的方法没有@Override情况在项目中,还是有遇到过,不知道是不是老代码迁移的问题,
    @Override表示的是一种继承的关系,表示对父类的重写,有助于开发者更好的理解代码的结构。

8.线程池不允许使用Executors去创建

线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

  • Executors各个方法的弊端:

    • 1.newFixedThreadPool和newSingleThreadExecutor:
      主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。
    • 2.newCachedThreadPool和newScheduledThreadPool:
      主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。
  • Positive example 1

     //org.apache.commons.lang3.concurrent.BasicThreadFactory
     ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,
         new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());
    
  • Positive example 2

     ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
         .setNameFormat("demo-pool-%d").build();
    
     //Common Thread Pool
     ExecutorService pool = new ThreadPoolExecutor(5, 200,
         0L, TimeUnit.MILLISECONDS,
         new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
    
     pool.execute(()-> System.out.println(Thread.currentThread().getName()));
     pool.shutdown();//gracefully shutdown
    

9.获取当前毫秒数:System.currentTimeMillis()

获取当前毫秒数:System.currentTimeMillis(); 而不是new Date().getTime();
说明:如果想获取更加精确的纳秒级时间值,用System.nanoTime。在JDK8中,针对统计时间等场景,推荐使用Instant类。

  • Negative example
    long b = new Date().getTime();
    
  • Positive example
    long a = System.currentTimeMillis();
    

10.避免用Apache Beanutils进行属性的copy。

说明:Apache BeanUtils性能较差,可以使用其他方案比如Spring BeanUtils, Cglib BeanCopier。

 TestObject a = new TestObject();
 TestObject b = new TestObject();
 a.setX(b.getX());
 a.setY(b.getY());

11.避免通过一个类的对象引用访问此类的静态变量或静态方法

避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。

  • Negative example
    实例化了一个对象,然后用这个对象引用调用了对象的静态方法
    class Demo{
      private static void getxxx(){
      ...
      }
    }
    //实例化对象调用了对象的静态方法
    Demo demo =new Demo()
    demo.getxxx();
    
  • Positive example
    class Demo{
      private static void getxxx(){
      ...
      }
    }
    Demo.getxxx();
    

后记
aliyun-check-script:阿里云检查脚本 立即下载

相关推荐

关闭阿里代码检测条件

Preferences -> Inspections -> Ali-Check

snpmyn 996

idea开发工具使用经验

idea开发工具使用经验 1.修改代码时CPU占用过高 2.debug调试时F8不可用 3.调整代码补全ctrl+space为shift+space 4.序列化class自动生成序列化ID 5.快速导包 6.代码提示、示例 7.驼峰转换插件 8.不显示service窗口(springboot面板) 9.启用自定义模块 10.快速foreach 11.断言失效 12.Intellij IDEA 快速添加maven依赖 13.idea部分页面在笔记本上显示不全!!! 14.Maven dependency

搬山境KL攻城狮的修炼手册 1693

使用Zipkin-SourceMonitor-AliCheck代码优化

微服务拆分后的代码优化摘要:工具组合简单介绍ZipkinSourceMonitorAliCheck工具使用ZipkinSourceMonitor函数圈复杂度(Function Complexity)函数深度(Block Depth)AliCheck总结 摘要: 系统做微服务拆分后,有很多业务流程比较慢,这时我们需要使用有效的方法来定位那些地方有问题。其实最好的方法还是利用系统化的检查工具来做这件事...

October 1203

代码规范---------Ali插件

   失踪人口回归    距离上次写博客,又两个月了!终归是我太懒了。。。     两个月的时间:培训一月,个人项目一月。不得不对公司的培训点赞!!!从运维到开发,从开发到数据库,从数据库到规范,从规范再到移动端,从移动端到算法,从算法最后到大数据,中间还夹杂着公司运维平台,各种工具的使用,不得不说超级全。无奈一口吃不了一个大胖子,只能日后慢慢消化。     接下来的一个月就是个人项目-...

就是这么菜 423

Alibaba p3c规则引擎终极配置指南:如何告别混乱代码并实现团队规范统一

你是否厌倦了团队中五花八门的编码风格?是否在Code Review中花费大量时间讨论基础规范?Alibaba p3c规则引擎正是解决这些痛点的终极方案。作为阿里巴巴Java开发指南的PMD实现,p3c不仅提供了一套完整的代码规范检查工具,更通过灵活的配置体系让团队能够快速统一编码标准,提升代码质量和开发效率。 ## 🔍 为什么选择p3c而非其他代码检查工具? 传统的代码检查工具往往存在配置复

gitblog_01094的博客 881

从混乱到规范:实战指南:如何深度配置P3C规则引擎提升代码质量

Alibaba Java Coding Guidelines(简称P3C)作为阿里巴巴开源的Java代码规范检查工具,通过PMD规则引擎为开发者提供了一套完整的代码质量保障方案。你是否曾因团队代码风格不统一而烦恼?是否在Code Review中花费大量时间检查基础规范问题?本文将带你深入P3C规则引擎的配置体系,从核心原理到实战配置,彻底解决代码规范落地难题。 ## 一、代码规范检查的痛点与P3

gitblog_00777的博客 935

3个维度深度配置阿里巴巴Java开发规约插件:从基础规则到企业级定制

阿里巴巴Java开发规约插件(p3c)是提升代码质量、统一团队编码风格的重要工具。作为基于PMD规则的静态代码分析引擎,它不仅能自动检测代码中的潜在问题,还提供了灵活的配置机制来适应不同团队的开发需求。本文将带你从基础规则配置深入到企业级定制,掌握p3c插件的完整配置体系。 ## 一、规则引擎架构:理解p3c的核心工作机制 p3c插件采用**规则定义-规则执行-结果展示**三层架构。规则定义存

gitblog_01195的博客 835

如何通过p3c规则配置解决团队代码规范落地难题

你是否遇到过这样的场景:团队制定了详细的Java编码规范,但在实际开发中却难以落地执行?😊 开发人员要么忘记规范细节,要么觉得手动检查太麻烦,最终导致代码质量参差不齐。p3c(Alibaba Java Coding Guidelines)作为阿里巴巴的Java编码规范插件,通过PMD规则引擎实现了自动化代码检查,解决了这一痛点。本文将带你从零开始,掌握p3c的规则配置技巧,让代码规范真正落地执行

gitblog_01053的博客 1057

这款 IDE 插件再次升级,让「小程序云」的开发部署提速 8 倍

今年3月份,在阿里云北京峰会上,阿里巴巴正式发布了“阿里巴巴小程序繁星计划”,截至当前,已经有成千上万的开发者加入这个计划,使得小程序得到蓬勃发展,然而不可避免的是,这些...

阿里巴巴中间件 363

阿里代码规范检查工具的安装使用

简单了解一下这插件 该插件由阿里巴巴 P3C 项目组研发。 代码已经开源,GitHub:https://github.com/alibaba/p3c 阿里介绍文章:https://mp.weixin.qq.com/s/IbibsXlWHlM59kfXJqRvZA#rd 插件支持了IDEA、Eclipse,在扫描代码后,将不符合规约的代码显示出来,甚至在 IDEA 上,还基于 Inspecti...

w522301629的博客 1149

阿里代码规范检查工具P3C的安装使用

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34345560的博客 456

java代码质量相关插件(PMD|JaCoCo|sonar)关于maven及IDEA使用及配置

java后端项目代码质量检测集成插件 静态代码分析:PMD 代码测试用例覆盖率:jacoco 持续代码质量检查:sonar 注:后续主要介绍,如何在maven和idea上提成上述插件 二、静态代码分析插件集成 ​ PMD是一种代码静态分析工具,当使用PMD规则分析Java源码时,PMD首先利用JavaCC和EBNF文法产生了一个语法分析器,用来分析普通文本形式的Java代码,产生符合特定语法结构的语法,同时又在JavaCC的基础上添加了语义的概念即JJTree,通过JJTree的一次转换,这样就将J.

liuzhupeng的专栏 3613

IDEA安装阿里代码规范检查插件

选择Plugins->Maketplace->搜索框输入Alibaba->找到Alibaba Java Coding Guidelines->Install。重启IDEA,Restart IDE,重启之后,即可生效。首先,可以在Tools->阿里编码规约->切换中英文。在项目右键->编码规约扫描,即可检查代码。可根据提示进行修改代码。检查结果和提示如下图。

颜淡慕潇 8406

IDEA使用阿里巴巴Alibaba编码规范插件

IDEA使用阿里巴巴Alibaba编码规范插件最新版《阿里巴巴Java开发手册》以及idea\插件等官方项目地址:https://github.com/alibaba/p3c。

qq_43985303的博客 2782

IDEA配置阿里代码检查工具

选择sittings 4. 点击install 按钮即可 5. 安装完成后重启idea 6. 在项目或者文件上直接右键即可看到 7.

隐心咒Amor的博客 1423

获取当前毫秒数:System.currentTimeMillis(); 而不是new Date().getTime()@阿里编码规约扫描解决

阿里编码规约扫描:获取当前毫秒数:System.currentTimeMillis(); 而不是new Date().getTime(); 原因是因为使用了new Date().getTime()来获取当前的毫秒数 改为使用System.currentTimeMillis()来获取当前的毫秒数即可解决。

心有谦谦结 2703

【学姐亲测】论文季救命神器!这4个AI工具能让你少熬半个月夜

去年这时候我也在电脑前抓耳挠腮,直到发现了几个AI神器,直接让我从"论文困难户"逆袭成"查重5%选手"。最绝的是降重功能,直接把"随着社会经济发展"这种套话,改成"现在大家钱包鼓了"这种大白话。像我这种总写"然后然后"的口水话选手,它能自动替换成高级词汇。准备答辩的时候,把论文结论部分丢进去选"口语化"模式,立马得到一份现成的演讲提纲。上次我肝了八千字的调查报告,它三十秒就提炼出三个核心结论,导师看了直夸重点抓得准。举个例子,你输入"短视频对大学生消费观的影响",选好专业和学历,三秒就能吐出个千字大纲。

2301_79545694的博客 433

java获取时间

强制】获取当前毫秒数 System.currentTimeMillis(); 而不是 new Date().getTime(); 说明:如果想获取更加精确的纳秒级时间值,使用 System.nanoTime()的方式。在 JDK8 中, 针对统计时间等场景,推荐使用 Instant 类。 public class TimeTest { public static void main(String[] args) { SimpleDateFormat sdf = new Simpl.

拱卒的博客 539

Java 项目Building之后发现的Blocker和Critical

刚来公司老大吩咐我做Code Quality. 需要做到所有的项目的Blocker 和 Critical 的数量为0.当时我觉得很难,因为我已经没有做个Java项目,所以面对这些Issue有点害怕,毕竟我的改动会造成整个项目的问题。当时就连一个空格老大都严格的要求我,格式有一点点的错误老大就回reject的提交的代码。。。。。。一把辛酸泪啊!想想刚来的时候神马Jekins,神马Jira,神马Son

hellobabygogo3的专栏 4993
上一篇: 和我一起实现EditText一键清空功能
下一篇: TextView
Client_Block
博客等级 码龄11年 32粉丝 61原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值