java - 当类只有最终字段时,如何在类的构造函数中只使用 if-else?
问题描述
我为给定的类编写了以下构造函数
public Gerade(Punkt punkt1, Punkt punkt2) {
if (!punkt1.equals(punkt2)) {
if (punkt1.getX().equals(punkt1.getX().min(punkt2.getX()))) {
this.p1 = punkt1;
this.p2 = punkt2;
} else if (punkt2.getX().equals(punkt1.getX().min(punkt2.getX()))) {
this.p1 = punkt2;
this.p2 = punkt1;
} else if (punkt1.getX().equals(punkt2.getX())) {
if (punkt1.getY().equals(punkt1.getY().min(punkt2.getY()))) {
this.p1 = punkt1;
this.p2 = punkt2;
} else if (punkt2.getY().equals(punkt1.getY().min(punkt2.getY()))) {
this.p1 = punkt2;
this.p2 = punkt1;
}
}
} else {
System.out.println("Punkte are identical!");
this.p1 = null;
this.p2 = null;
}
}
以及以下两个最终字段:
private final Punkt p1;
private final Punkt p2;
不管代码实际上在做什么:问题是,我得到一个编译错误,因为如果出于任何原因,两个传递的变量 punkt1 和 punkt2 碰巧与构造函数中的 if-else 情况不兼容,最后字段可能未初始化。(我觉得这很奇怪,因为 else 案例应该解释任何可能出现的其他情况,不是吗?)
问题是,由于它们必须是最终的,我也不能在 if-else 构造之前或之后将“标准案例”写入构造函数,因为那样的话 if-else 构造不能再次设置字段(如果之前是标准情况),或者它们可能已经被 if-else 构造设置,因此之后不能再次初始化(如果之后是标准情况)。
我也不能使用任何设置器,因为这些字段是最终的。最后但同样重要的是,我不应该实现任何其他构造函数。
有没有办法解决这个问题,可能吗?任何帮助将不胜感激!
解决方案
可以不初始化您的字段。您必须处理所有情况:
public Gerade(Punkt punkt1, Punkt punkt2) {
if (!punkt1.equals(punkt2)) {
if (punkt1.getX().equals(punkt1.getX().min(punkt2.getX()))) {
this.p1 = punkt1;
this.p2 = punkt2;
} else if (punkt2.getX().equals(punkt1.getX().min(punkt2.getX()))) {
this.p1 = punkt2;
this.p2 = punkt1;
} else if (punkt1.getX().equals(punkt2.getX())) {
if (punkt1.getY().equals(punkt1.getY().min(punkt2.getY()))) {
this.p1 = punkt1;
this.p2 = punkt2;
} else if (punkt2.getY().equals(punkt1.getY().min(punkt2.getY()))) {
this.p1 = punkt2;
this.p2 = punkt1;
} else {
//here
p1 = null;
p2 = null;
}
} else {
//here
p1 = null;
p2 = null;
}
} else {
System.out.println("Punkte are identical!");
this.p1 = null;
this.p2 = null;
}
}
但是这么多 if 语句并不是一个好主意。
推荐阅读
- python - 我有一个成本值列表,其中包括百万和十亿的“M”和“B”。我想创建一个将这些值显示为数字的新列表
- xamarin - 如何使用 C# 在 Tizen 手表中使用 Skiasharp 加载图像
- sql - SQL 命令 (ORACLE) 添加具有名称的约束
- javascript - d3.js 堆叠条形图排序/更改堆栈中单个值的顺序
- r - 在 R 和正则表达式中添加前面的“+”号
- react-native - textinput 文本未使用 onsubmitEditing 提交使用 reactnative
- byte-buddy - 如何使用 MethodCall.invoke(someElementMatcher) 创建一个 MethodCall 来表示我随后在检测类型中定义的方法?
- python - 基于共享键合并两个字典
- javascript - 从 findAll 获取数据并将其传递给 ejs 文件
- python - 如何使用 bomradarloop python 库?