目录
3.1 正则表达式,要利用好预编译功能,加快正则表达式的匹配速度
3.3 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式。
3.5 避免使用Apache Beanutils 进行属性拷贝
3.6 在if/else/for/while/do语句中必须使用大括号,即使只有一行代码,避免使用
3.9 对于垃圾代码和过时配置,请及时清理,避免代码过于冗余
3.9.1 避免通过一个类的对象引用再去访问此类的静态变量或者静态方法,增加编译器解析成本,直接用类名来访问~
序:
阿里巴巴的插件的git地址:
https://github.com/alibaba/p3c
- 中文版: 阿里巴巴Java开发手册
- English Version: Alibaba Java Coding Guidelines
- 阿里巴巴Java开发手册》书籍版天猫官方店: 阿里巴巴Java开发手册最新版
- 《码出高效》书籍版天猫官方店: 码出高效:Java开发手册
哭哭 啥时候能成为一个阿里的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 避免通过一个类的对象引用再去访问此类的静态变量或者静态方法,增加编译器解析成本,直接用类名来访问~