Java中如何复用针对类不同属性的重复逻辑代码?
代码复用方案建议
针对你遇到的X/Y轴逻辑重复问题,推荐用枚举+通用方法的方式重构,既符合Java语法规范,又能彻底消除重复代码,新手也容易上手。
1. 定义坐标轴枚举
先创建一个Axis枚举,把X、Y轴抽象成固定的枚举值,作为通用方法的参数区分不同轴:
public enum Axis { X, Y }
2. 提取通用坐标获取方法
把原来的getX()、getY()逻辑合并成一个接受Axis参数的通用方法,避免重复分支判断:
// 假设你的顶点类有getX()、getY()方法 private double getCoordinate(Vertex vertex, Axis axis) { switch (axis) { case X: return vertex.getX(); case Y: return vertex.getY(); default: throw new IllegalArgumentException("不支持的坐标轴类型"); } }
3. 重构重复的轴相关方法
把areDiffX/Y、compareTriangleDomain/Codomain这类重复方法,改成接受Axis参数的通用方法:
示例1:合并areDiffX/Y
// 替代原来的areDiffX和areDiffY private boolean areVerticesDiff(Vertex v1, Vertex v2, Axis axis) { // 几何计算注意浮点数精度,不要直接用==判断相等 return Math.abs(getCoordinate(v1, axis) - getCoordinate(v2, axis)) > 1e-9; }
示例2:合并compareTriangleDomain/Codomain
假设compareTriangleDomain是比较三角形在某轴上的最小值,compareTriangleCodomain是比较最大值,可统一成:
private int compareTriangleRange(Triangle t1, Triangle t2, Axis axis, boolean compareMin) { double range1 = getTriangleRange(t1, axis, compareMin); double range2 = getTriangleRange(t2, axis, compareMin); return Double.compare(range1, range2); } // 获取三角形在指定轴上的最小/最大值 private double getTriangleRange(Triangle triangle, Axis axis, boolean getMin) { Vertex v1 = triangle.getVertex1(); Vertex v2 = triangle.getVertex2(); Vertex v3 = triangle.getVertex3(); double val1 = getCoordinate(v1, axis); double val2 = getCoordinate(v2, axis); double val3 = getCoordinate(v3, axis); return getMin ? Math.min(Math.min(val1, val2), val3) : Math.max(Math.max(val1, val2), val3); }
4. 调用重构后的方法
原来的调用:
areDiffX(v1, v2); compareTriangleDomainX(t1, t2); compareTriangleCodomainY(t1, t2);
改成:
areVerticesDiff(v1, v2, Axis.X); compareTriangleRange(t1, t2, Axis.X, true); // true表示比较最小值(domain) compareTriangleRange(t1, t2, Axis.Y, false); // false表示比较最大值(codomain)
额外注意点
- 浮点数比较必须用误差范围(比如
1e-9),避免因精度丢失导致错误判断 - 如果后续需要扩展3D三角形,只需在
Axis枚举中添加Z,并修改getCoordinate方法即可,扩展性极强
内容的提问来源于stack exchange,提问作者Thay
相关产品推荐
相关产品推荐

