PancrasL的博客

Java 编程习惯和技巧

2021-05-28

See the source image

1. 编程习惯

1.1 命名

  • 类、方法、变量采用驼峰命名法,类首字母大写
  • 项目名称采用串式命名法(kebab-case),例如“aaa-bbb-ccc”
  • 类、变量用名词、方法用动词

1.2 异常处理

1.2.1 开发中如何选择使用try-catch-finally还是throws?

  • 父类方法没抛异常,则子类重写该方法时也不能抛异常,此时如果在重写方法时出现了异常,需要使用try-catch进行处理
  • 存在调用链main->A->B->C,当方法ABC存在异常时,在main处理异常,方法内部将异常抛出即可。

1.3 比较继承 Thread 和实现 Runnable 两种方式实现多线程

  • 优先选择 Runnable 方式
  • 原因:1. 实现的方式没有类的单继承的局限性 2. 实现的方式更适合用来处理多个线程共享数据的情况

1.4 Lock和synchronized

  • 都可以解决同步问题
  • synchronized自动实现获取锁、释放锁,lock需要手动实现
  • 建议使用lock>同步代码块>同步方法

2. 应用开发

2.1 Properties的使用

1
2
3
4
5
6
7
8
public static void main(String[] args) throws Exception{
Properties pros = new Properties();

FileInputStream fis = new FileInputStream("test.properties");
pros.load(fis);

String name = pros.getProperty("name");
}

2.2 Spring Bean管理

  • 使用xml管理bean,使用注解注入属性

2.3 单例工厂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class SingletonFactory {
private static final Map<String, Object> OBJECT_MAP = new ConcurrentHashMap<>();

private SingletonFactory() {
}

public static <T> T getInstance(Class<T> c) {
if (c == null) {
throw new IllegalArgumentException();
}
String key = c.toString();
if (OBJECT_MAP.containsKey(key)) {
return c.cast(OBJECT_MAP.get(key));
} else {
// If the value is null, the value of the second parameter will be stored and returned
return c.cast(OBJECT_MAP.computeIfAbsent(key, k -> {
try {
return c.getDeclaredConstructor().newInstance();
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}));
}
}
}