编写 equals 方法

基本原则(不变式):

  • equals 相等,hashCode 一定相等。
  • hashCode 相等(或 HashMap 中计算得下标相等),equals 不一定相等(hash 冲突)。

结论:

  • 如果重写了 equals 方法,一定要重写 hashCode 方法。

最佳实践:

TODO:

  • 允许特定类 Scope 内的比较?
  • 允许非对称(unsymmetric)比较?

switch 语句书写规范

  • switchcase 关键字对齐,减少缩进,case 子句只有一次缩进。
  • case 子句最后一句通常是 break 语句,特殊情况请明确添加注释说明。
  • 通常要写出 default 语句,作为最后一个子句,同样必须以 break 结束。
  • case 子句较复杂时,子句块之间应加一个空行使代码更清晰。
  • 如果 case 子句定义了新变量,应添加大括号为 case 子句新建一个局部作用域。

java 代码示例:

public class Test {

	public static void main(String[] args) {
		@lombok.Cleanup
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		switch (n) {
		case 1: {
			int k = n + 10000;
			System.out.println("111 " + k);
			break;
		}

		case 2: {
			int k = n + 1000;
			System.out.println("22 " + k);
			break;
		}

		default:
			System.out.println("default: " + n);
			break;
		}
	}
	
}

退出 scope 时自动清理

C++

  • 使用栈对象的析构函数

java

  • 使用 try { } finally {} 语法。

    • 缺点:代码增加缩进层次。
    • 缺点: 初始化与清理代码分离,可能不方便阅读和维护。
  • 使用 java 7 try-with-resources 语法 try () { }。类似 @lombok.Cleanup,但会增加代码缩进。

  • 使用 @lombok.Cleanup

    • 缺点:有时需要创建对象进行封装,产生额外类定义和对象创建成本。

    StringBuilderMarker 类定义示例:

    public class StringBuilderMarker implements AutoCloseable {
    
    	public final StringBuilder sb;
    	public final int len;
    	
    	public StringBuilderMarker(StringBuilder sb) {
    		this.sb = sb;
    		this.len = sb.length();
    	}
    
    	@Override
    	public void close() {
    		sb.setLength(len);
    	}
    	
    }