SpringAOPのソースコードを読んでいたら、こういうコードがあった(ノイズを除去するためにコードは調整済み)。
AspectJExpressionPointcut.java
public class AspectJExpressionPointcut {
private static final Set<PointcutPrimitive> SUPPORTED_PRIMITIVES = new HashSet();
static {
SUPPORTED_PRIMITIVES.add(PointcutPrimitive.EXECUTION);
SUPPORTED_PRIMITIVES.add(PointcutPrimitive.ARGS);
SUPPORTED_PRIMITIVES.add(PointcutPrimitive.REFERENCE);
SUPPORTED_PRIMITIVES.add(PointcutPrimitive.THIS);
SUPPORTED_PRIMITIVES.add(PointcutPrimitive.TARGET);
SUPPORTED_PRIMITIVES.add(PointcutPrimitive.WITHIN);
SUPPORTED_PRIMITIVES.add(PointcutPrimitive.AT_ANNOTATION);
SUPPORTED_PRIMITIVES.add(PointcutPrimitive.AT_WITHIN);
SUPPORTED_PRIMITIVES.add(PointcutPrimitive.AT_ARGS);
SUPPORTED_PRIMITIVES.add(PointcutPrimitive.AT_TARGET);
logger = LogFactory.getLog(AspectJExpressionPointcut.class);
}
}
これは静的初期化ブロックと言われる仕組み。
これまで、staticで宣言したList/Setなどの初期化は↓のように書いていたけれど、静的初期化ブロックのほうがスッキリ見える気がする。
public class Hoge {
private static final Set<PointcutPrimitive> SUPPORTED_PRIMITIVES = new HashSet(){{
add(PointcutPrimitive.EXECUTION);
add(PointcutPrimitive.ARGS);
add(PointcutPrimitive.REFERENCE);
add(PointcutPrimitive.THIS);
add(PointcutPrimitive.TARGET);
add(PointcutPrimitive.WITHIN);
add(PointcutPrimitive.AT_ANNOTATION);
add(PointcutPrimitive.AT_WITHIN);
add(PointcutPrimitive.AT_ARGS);
add(PointcutPrimitive.AT_TARGET);
}};
}