
本文介绍如何为 java 类的字段添加输入控制逻辑,确保宽度和长度等属性始终为正整数,并对负值自动取绝对值,同时通过封装、构造器和 setter 方法提升代码健壮性与可维护性。
在面向对象编程中,直接暴露类的字段(如 public int width)会破坏封装性,导致外部代码随意赋值,难以统一约束逻辑。针对您的 Rect 类需求——即保证 width 和 length 始终为大于 0 的整数,且对负值自动转为绝对值——最佳实践是:将字段设为 private,并通过构造器和 setter 方法集中处理输入校验与修正。
以下是重构后的专业实现:
public class Rect {
private int x;
private int y;
private int width;
private int length;
// 构造器:初始化时即应用约束逻辑
public Rect(int x, int y, int width, int length) {
this.x = x;
this.y = y;
this.width = validatePositive(width);
this.length = validatePositive(length);
}
// 辅助方法:确保值为正整数(负数取绝对值,0 强制设为 1)
private int validatePositive(int value) {
int absValue = Math.abs(value);
return absValue == 0 ? 1 : absValue; // 避免 width/length 为 0
}
// Getter 方法(可选,但推荐)
public int getWidth() { return width; }
public int getLength() { return length; }
public int getX() { return x; }
public int getY() { return y; }
// Setter 方法:所有修改都经过验证
public void setWidth(int width) {
this.width = validatePositive(width);
}
public void setLength(int length) {
this.length = validatePositive(length);
}
public void setDimensions(int width, int length) {
this.width = validatePositive(width);
this.length = validatePositive(length);
}
// 其他业务方法保持不变(已适配封装)
public int getPerimeter() {
return 2 * (width + length);
}
public int getArea() {
return width * length;
}
public void move(int x, int y) {
this.x = x;
this.y = y;
}
public void changeSize(int n) {
setDimensions(n, n); // 复用带校验的 setter
}
public void print() {
int area = getArea();
int perimeter = getPerimeter();
System.out.printf("X: %d%n", x);
System.out.printf("Y: %d%n", y);
System.out.printf("Length: %d%n", length); // 注意:原题中 length 实际表示“长”,width 表示“宽”
System.out.printf("Width: %d%n", width);
System.out.printf("Area: %d%n", area);
System.out.printf("Perimeter: %d%n", perimeter);
}
// 主方法演示安全初始化与使用
public static void main(String[] args) {
// ✅ 正确:自动处理负值和零值
Rect r1 = new Rect(3, 4, -2, 0); // → width=2, length=1
r1.print();
// ✅ 安全修改
r1.setWidth(-5); // → width=5
r1.setLength(10); // → length=10
r1.print();
}
}关键改进说明:
- ✅ 封装性增强:所有字段均为 private,杜绝非法直写;
- ✅ 单一验证入口:validatePositive() 统一处理取绝对值 + 零值兜底(矩形边长不能为 0);
- ✅ 构造器与 setter 双重保障:无论初始化还是后续修改,均触发校验;
- ✅ 语义清晰:print() 方法不再依赖外部传入 area/perimeter,避免调用者出错;
- ✅ 健壮性提升:即使传入 -100 或 0,实例状态始终合法。
⚠️ 注意事项:Math.abs(Integer.MIN_VALUE) 会溢出(仍为 Integer.MIN_VALUE),但在实际图形/几何场景中极少出现该极端值;如需极致安全,可在 validatePositive 中额外判断 value == Integer.MIN_VALUE 并抛异常或设默认值。
通过这种方式,您不仅满足了“非负整数”需求,更构建了一个可维护、可扩展、符合 Java 编码规范的工业级基础类。
立即学习“Java免费学习笔记(深入)”;










