用private修饰属性+自定义Getter/Setter是实现运行时输入校验最直接可控的方式:1.属性设为private以切断外部直连修改;2.setter中做非空、格式、范围等校验,失败抛异常;3.Getter可返回trim后字符串或不可变副本;4.引用类型需防御性拷贝。

用 private 修饰属性 + 自定义 Getter/Setter,是实现运行时输入校验最直接、可控的方式。关键不是“隐藏”,而是把赋值入口收归到 setter 中,在那里做判断、转换、拦截或抛错。
1. 把属性设为 private,切断外部直连修改
这是前提。不加 private,别人绕过 setter 直接 obj.name = " " 或 obj.age = -5,校验就形同虚设。
例如:
Java 示例:private String email; private int age;
2. 在 setter 里写校验逻辑,失败时主动拒绝
不要默默修正(如自动 trim),除非业务明确要求;更不要静默忽略非法值。推荐:校验不通过就抛异常(如 IllegalArgumentException),让调用方意识到问题。
常见校验场景:
- 非空与去首尾空格:
if (email == null || email.trim().isEmpty()) throw new IllegalArgumentException("邮箱不能为空"); - 格式匹配:
if (!email.matches("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$")) throw ... - 数值范围:
if (age 150) throw new IllegalArgumentException("年龄必须在 0~150 之间"); - 枚举约束:
if (!Arrays.asList("ACTIVE", "INACTIVE").contains(status)) throw ...
3. Getter 可补充读取时的标准化处理(可选但实用)
比如返回不可变副本、自动 trim、格式化日期等,避免外部拿到脏数据或可变对象被意外修改。
例如:
public String getEmail() { return email != null ? email.trim() : null; }public List<string> getTags() { return Collections.unmodifiableList(tags); }</string>
4. 注意值类型与引用类型的区别处理
基本类型(int, boolean)和 String 是安全的;但对集合、数组、自定义对象,setter 要防御性拷贝,否则外部仍能绕过校验修改内部状态。
例如:
- 错误写法:
this.permissions = permissions; // 外部改 permissions 就等于改了内部 - 正确写法:
this.permissions = new ArrayList(permissions); // 或用不可变包装

















