【问题标题】:How to use only if-else in constructor of class when the class only got final fields?当类只有最终字段时,如何在类的构造函数中只使用 if-else?
【发布时间】:2020-12-22 15:06:15
【问题描述】:

我为给定的类编写了以下构造函数

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;
        }

}

以及以下两个final字段:

private final Punkt p1;
private final Punkt p2;

不管代码实际在做什么:问题是,我得到一个编译错误,因为如果出于任何原因,两个传递的变量 punkt1 和 punkt2 碰巧与构造函数中的 if-else 情况不兼容,最终字段可能不会被初始化。 (我觉得这很奇怪,因为 else 案例实际上应该解释可能出现的任何其他情况,不是吗?)

问题是,因为它们必须是最终的,我也不能在 if-else 构造之前或之后将“标准案例”写入构造函数,因为那样的话,if-else 不能再次设置字段else 构造(如果之前是标准情况),或者它们可能已经被 if-else 构造设置,因此之后不能再次初始化(如果之后是标准情况)。

我也不能使用任何设置器,因为字段是最终的。最后但同样重要的是,我不应该实现任何其他构造函数。

有没有办法解决这个问题,可能吗?任何帮助将不胜感激!

【问题讨论】:

  • 原因很简单:不是所有的分支都初始化p1p2,编译器不允许这样做。所有if 语句都需要和else 块,所以编译器知道你已经覆盖了所有情况。
  • 你最外层的if 没有实现else 的情况。所以并不是所有的路径都被覆盖

标签: java class constructor


【解决方案1】:

可以不初始化您的字段。您必须处理所有情况:

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 语句并不是一个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多