alibaba java idea 插件——alibaba java coding guidelines(一)安装与修改block级别的代码~

目录

序:

1 . 安装

2.  扫描方式

3. blocker

3.1  正则表达式,要利用好预编译功能,加快正则表达式的匹配速度

3.2 所有的Override 必须加上注解!

3.2.1  方法签名是什么?

3.3 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式。

 3.4 获取当前毫秒数

3.5  避免使用Apache Beanutils 进行属性拷贝

3.6 在if/else/for/while/do语句中必须使用大括号,即使只有一行代码,避免使用

3.7 对于需要关闭的IO流

3.7.1 对于null进行强制类型转换并赋值是不会报错的 

3.8 对于代码注释,请不要在代码后面紧接着用//注释

3.9 对于垃圾代码和过时配置,请及时清理,避免代码过于冗余

3.9.1 避免通过一个类的对象引用再去访问此类的静态变量或者静态方法,增加编译器解析成本,直接用类名来访问~


序:

阿里巴巴的插件的git地址:

https://github.com/alibaba/p3c

哭哭 啥时候能成为一个阿里的coder 我也想被叫做同学!!

下面是今天的歌词推荐:

我怎么哭了 /当我偶然想起了 想起有你的时刻/ 哼起你最爱的歌 点了你爱的菜色/

为什么哭呢/ 明明抚平了伤痕 好好过我的人生/ 绝不是 因为你那 无心一句

最近如何                                                                    ——831 《我怎么哭了》

1 . 安装

2.  扫描方式

再点击编码规范扫描就可以 ~

还有实时的扫描

3. blocker

这个里面的级别是最高级别的编码问题,需要马上立刻解决~

3.1  正则表达式,要利用好预编译功能,加快正则表达式的匹配速度

比如: 

 public static String replaceBlank(String str) {
        String dest = "";
        if (str!=null) {
            Pattern p = Pattern.compile("\n");
            Matcher m = p.matcher(str);
            dest = m.replaceAll("");
        }
        return dest;
    }

上述代码是不被推荐的,需要避免使用变量来生成Pattern,

那么下列代码,将:

private static Pattern PATTERN_BLANK = Pattern.compile("\n");

public static String replaceBlank(String str) {
        String dest = "";
        if (str!=null) {
            Matcher m = PATTERN_BLANK .matcher(str);
            dest = m.replaceAll("");
        }
        return dest;
    }

3.2 所有的Override 必须加上注解!

所有的覆写方法,必须加@Override注解。 反例:getObject()与get0bject()的问题。一个是字母的O,一个是数字的0,加@Override可以准确判断是否覆盖成功。另外,如果在抽象类中对方法签名进行修改,其实现类会马上编译报错。

3.2.1  方法签名是什么?

对不起,我竟然不知道方法签名!!!

看到阿里的代码规范里面提到了这个,那么查阅一下~

方法头中定义的变量称为形参 (形式参数,formal parameter 或 parameter),形参如同占位符。当方法被调用时,传递一个值给形参,此值称为实参(实际参数, actual parameter 或 argument),形参列表指的是形参的类型、顺序和形参的数目。

方法名和形参列表共同组成方法签名

3.3 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式。

使用ThreadPoolExecutor可以让写的同学更加明确线程池的运行规则,规避资源耗尽的风险

下面是插件中的内容:

线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors返回的线程池对象的弊端如下:
1)FixedThreadPool和SingleThreadPool:
  允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
2)CachedThreadPool:
  允许的创建线程数量为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
       
        
            
Positive example 3:
    <bean id="userThreadPool"
        class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="10" />
        <property name="maxPoolSize" value="100" />
        <property name="queueCapacity" value="2000" />

    <property name="threadFactory" value= threadFactory />
        <property name="rejectedExecutionHandler">
            <ref local="rejectedExecutionHandler" />
        </property>
    </bean>
    //in code
    userThreadPool.execute(thread);

比如我们代码里面写了一段:

private static ExecutorService fixedThreadPool = Executors.newFixedThreadPool(20);

提示就是如果手动创建线程池,效果会更好~

因为线程池内容比较多,就单开一个博文来写,学习~

https://blog.csdn.net/pmdream/article/details/96870444

 

 3.4 获取当前毫秒数

获取当前毫秒数:System.currentTimeMillis(); 而不是new Date().getTime(); 说明:如果想获取更加精确的纳秒级时间值,用System.nanoTime。在JDK8中,针对统计时间等场景,推荐使用Instant类。
    public class TimeMillisDemo {
        public static void main(String args[]) {
            // Positive example:
            long a = System.currentTimeMillis();
            // Negative example:
            long b = new Date().getTime();

            System.out.println(a);
            System.out.println(b);
        }
    }

上述方法能不用new就不用new 可以减少服务器的压力。

3.5  避免使用Apache Beanutils 进行属性拷贝

避免用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());

那么也就是用Spriong 的BeanUtils就可以啦~

有两种BeanUtils的依赖包,一个是spring framework的一个是Apache

应选用spring的~

(package org.apache.commons.beanutils; 被我画了XX)

3.6 在if/else/for/while/do语句中必须使用大括号,即使只有一行代码,避免使用

这个不会犯错的~

3.7 对于需要关闭的IO流

可以使用 IOUtils.

IOUtils.closeQuietly();
//这个函数功能很强~

Maven依赖如下:

   <!-- https://mvnrepository.com/artifact/org.apache.directory.studio/org.apache.commons.io -->
        <dependency>
            <groupId>org.apache.directory.studio</groupId>
            <artifactId>org.apache.commons.io</artifactId>
            <version>2.4</version>
        </dependency>

其实它的原理就是:

  public static void closeQuietly(InputStream input) {
        closeQuietly((Closeable)input);
    }

public static void closeQuietly(Closeable closeable) {
        try {
            if (closeable != null) {
                closeable.close();
            }
        } catch (IOException var2) {
            ;
        }

    }

将input的流强制类型转换,然后去判断它是不是空的(出现NPE就是程序员的失职)

3.7.1 对于null进行强制类型转换并赋值是不会报错的 

 public static void main(String[] args) {


        /**
         * 这里说明可以进行对NULL强制类型转换
         * */
        InputStream inputStream = null;
        System.out.println((FileInputStream) inputStream);
        
        //只为了验证null强转基本类型,请忽略辣眼睛的写法
        Object obj = null;
        //这种编译不会报错,但是运行会报错,出现NPE
        int s1 = (Integer) obj;
        System.out.println(s1);
        
        Integer s2 = (Integer) obj;
        System.out.println(s2);
        IOUtils.closeQuietly(inputStream);
    }

3.8 对于代码注释,请不要在代码后面紧接着用//注释

需要另起一行,对于多行注释,请使用

/***/

3.9 对于垃圾代码和过时配置,请及时清理,避免代码过于冗余

3.9.1 避免通过一个类的对象引用再去访问此类的静态变量或者静态方法,增加编译器解析成本,直接用类名来访问~

 

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值