java 枚举使用举例

关于枚举的用法, 备忘一下.

public enum MonitorKey {
    query(A.class, "query"),
    update(A.class, "update"),
    ...
;

    Class<?> targetClazz;
    String targetMehtodName;

    MonitorKey() {
    }

    MonitorKey(Class<?> clazz, String methodName) {
        this.targetClazz = clazz;
        this.targetMehtodName = methodName;
    }

    /**
     *忽略不需要埋点的调用
     *
     * @param invocation
     * @return
     */
    public boolean ignored(MethodInvocation invocation) {
        Method method = invocation.getMethod();
        String className = method.getDeclaringClass().getName();
        return !className.equals(targetClazz.getName()) || !method.getName().equals(targetMehtodName);
    }

}


在MonitorUtils中:
public static void addSuccess(MethodInvocation invocation, MonitorKey key, long duration) {
        if (key.ignored(invocation)) {
            return;
        }

        ...
    }
public static void addFailure(MethodInvocation invocation, MonitorKey key, long duration) {
        if (key.ignored(invocation)) {
            return;
        }

        ...
    }


在使用到MonitorUtils的MonitorInterceptor
    public void doSuccess(MethodInvocation invocation, long duration) {
        MonitorUtils.addSuccess(invocation, MonitorKey.update, duration);

    }

    public void doFailure(MethodInvocation invocation, long duration, Throwable e) {
        MonitorUtils.addFailure(invocation, MonitorKey.update, duration);
    }


这里使用枚举不是为了简单的定义一个常量, 而是将原来包含在Interceptor中的判断逻辑(在doSuccess, doFailure中均要使用相同的判断逻辑)放到枚举类型MonitorKey中, 可以将这里的枚举理解为状态模式的一种应用

你可能感兴趣的:(java)