目录
1.1 Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。
1.2 SimpleDateFormat是线程不安全的类,一般不要定义为static变量
1.4 在一个switch块内,每个case要么通过break/return等来终止,要么注释说明程序将继续执行到哪一个case为止
1.5 对于Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别
1.9 方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase,必须遵从驼峰形式
序:
继承上一章
https://blog.csdn.net/pmdream/article/details/96857062
1. critical
1.1 Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。
public void f(String str){
String inner = "hi";
if (inner.equals(str)) {
System.out.println("hello world");
}
}
也就是常量或者确定的值来调用equals
1.2 SimpleDateFormat是线程不安全的类,一般不要定义为static变量
如果定义为static,必须加锁!!!或者使用DateUtils的工具类
private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
那么可以这样写,需要使用的时候new一下就可以
private static final String FORMAT = "yyyy-MM-dd HH:mm:ss";
public String getFormat(Date date){
SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT);
return sdf.format(date);
}
或者 加锁:
private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public void getFormat(){
synchronized (sdf){
sdf.format(new Date());
….;
}
或者
private static final ThreadLocal<DateFormat> DATE_FORMATTER = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");
}
};
1.3 不能使用过时的类或者方法
不能使用过时的类或方法。 说明:java.net.URLDecoder 中的方法decode(String encodeStr) 这个方法已经过时,应该使用双参数decode(String source, String encode)。接口提供方既然明确是过时接口,那么有义务同时提供新的接口;作为调用方来说,有义务去考证过时方法的新实现是什么。
1.4 在一个switch块内,每个case要么通过break/return等来终止,要么注释说明程序将继续执行到哪一个case为止
在一个switch块内,都必须包含一个default语句并且放在最后,即使它什么代码也没有。
switch (x) {
case 1:
break;
case 2:
break;
default:
}
这个就跟我上次写的小坑,https://blog.csdn.net/pmdream/article/details/96289840
1.5 对于Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别
public interface DemoService{
void f();
}
public class DemoServiceImpl implements DemoService {
@Override
public void f(){
System.out.println("hello world");
}
}
1.5.1 SOA理念是什么 ?
SOA全称是啥?Service-Oriented Architecture
其实就是面向服务的体系结构,松耦合,服务之间通过接口进行通信,不涉及底层接口模型和通信模型。
1.6 枚举类型字段必须注释,说明每个数据项的用途
public enum TestEnum {
/**
* agree
*/
agree("agree"),
/**
* reject
*/
reject("reject");
private String action;
TestEnum(String action) {
this.action = action;
}
public String getAction() {
return action;
}
}
1.7 所有编程相关的命名均不能以下划线或美元符号开始
private static com.sun.net.ssl.HostnameVerifier __hostnameVerifier;
汗 这个是SSL 的Utils = = 可能阿里的规范和别的公司还是不太一样吧~
1.8 抽象类命名使用Abstract或Base开头
abstract class BaseControllerDemo{
}
abstract class AbstractActionDemo{
}
1.9 方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase,必须遵从驼峰形式
2.0 线程资源必须通过线程池提供(重点)
不允许在应用中自行显式创建线程。 说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
.setNameFormat("demo-pool-%d").build();
ExecutorService singleThreadPool = new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
singleThreadPool.execute(()-> System.out.println(Thread.currentThread().getName()));
singleThreadPool.shutdown();