【代码设计】Java 用注解简洁明了的标注数据筛选特性
基础设计
默认值:仅包含正常状态数据,例如账户:不包含离职账户的正常账户 即为 deletedData = false, wantsEnabled = true, wantsDisabled = false
场景举例:
- 场景一:正常的只展示正常的账户,则为默认的情况
- 场景二:只搜索不正常的已经删除的账户,则与上一条完全相反,则为 wantsEnabled = false, wantsDisabled = true
- 场景三:不考虑状态的查询,无限制查询,则所有的值都是为true,可以使用 @Record
基础注解
@interface Restriction {
/**
* 该接口是否返回 deleted的数据
*/
boolean deleted() default false;
/**
* 该接口是否筛选了状态为正常的数据
*/
boolean enabled() default true;
/**
* 该接口是否筛选了状态为非正常的数据
*/
boolean disabled() default false;
}
场景注解
@Restriction(deleted = true, enabled = false, disabled = true)
@interface Deleted {
}
@Restriction(deleted = false, enabled = true, disabled = false)
@interface Visible {
}
@Restriction(deleted = false, enabled = true, disabled = true)
@interface NonDeleted {
}
@Restriction(deleted = true, disabled = true)
@interface Record {
}
进阶设计
注解+枚举
枚举对应值,注解是枚举的容器,且支持混合策略,支持向后扩展
public enum PolicyType {
RECORD, NON_DELETED, DELETED, VISIBLE
}
public @interface Policy {
PolicyType[] value() default PolicyType.VISIBLE;
}
使用方法
方法一(推荐):
@Policy(PolicyType.NON_DELETED)
public User queryByUserName(String userName) ;
方法二:
@Restriction.NonDeleted
public User queryByUserName(String userName) ;
方法三:
@Restriction(deleted = false, enabled = true, disabled = true)
public User queryByUserName(String userName) ;
- 可读性:方法一 >= 方法二 > 方法三
- 简洁性:方法二 > 方法一 > 方法三
- 原子性:方法一 > 方法二 > 方法三
- 扩展性:方法一 >= 方法二 >= 方法三
- 精确性:方法三 > 方法一 >= 方法二
- 灵活性:方法三 > 方法一 >= 方法二
对比原则
- 原子性:方法一使用了枚举类型,不会被意外修改
- 简洁性:方法二的代码长度最短
单一类实现
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Policy {
Type[] value() default Type.VISIBLE;
@interface DELETED {
Type value() default Type.DELETED;
}
@interface Visible {
Type value() default Type.VISIBLE;
}
@interface NonDeleted{
Type value() default Type.NON_DELETED;
}
@interface Record {
Type value() default Type.UNLIMITED;
}
enum Type {
UNLIMITED, NON_DELETED, NEGATIVE, VISIBLE
}
}
使用方法参考方法二
实际应用
避免复杂的设计,实际上为了一眼看出数据范围,标明清楚即可。
public @interface QueryHint {
Type[] value() default {QueryHint.Type.VISIBLE};
public static enum Type {
UNLIMITED,
NON_DELETED,
DELETED,
ENABLED,
VISIBLE;
private Type() {
}
}
public @interface Deleted {
Type value() default QueryHint.Type.DELETED;
}
public @interface NonDeleted {
Type value() default QueryHint.Type.NON_DELETED;
}
public @interface Record {
Type value() default QueryHint.Type.UNLIMITED;
}
public @interface Visible {
Type value() default QueryHint.Type.VISIBLE;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2018-12-13 Mysql UTF-8mb4字符集的问题