【问题标题】:Using methods inside a constructor在构造函数中使用方法
【发布时间】:2019-01-06 15:04:00
【问题描述】:

我是学习 Java 的新手,并试图了解 OOP,但我似乎找不到任何有相同问题的人。我的问题是,是否可以在构造函数中使用方法,例如此处的示例:

package ezrab.nl;

public class Calculations {

    private int number;
    private int multiplier;

    private String operator = "";

    public Calculations(int number, String operator, int multiplier) {
        this.number = number;
        this.operator = operator;
        this.multiplier = multiplier;
        switch (getOperator()) {
        case "+":
            System.out.println(getNumber() + getMultiplier());
            break;
        case "-":
            System.out.println(getNumber() - getMultiplier());
            break;
        case "*":
            System.out.println(getNumber() * getMultiplier());
            break;
        case "/":
            System.out.println(getNumber() / getMultiplier());
            break;
        case "%":
            System.out.println(getNumber() % getMultiplier());
            break;
        default:
            System.out.println("Something went wrong.");
        }
    }

    public int getNumber() {
        return this.number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public int getMultiplier() {
        return this.multiplier;
    }

    public void setMultiplier(int multiplier) {
        this.multiplier = multiplier;
    }

    public String getOperator() {
        return this.operator;
    }

    public void setOperator(String operator) {
        this.operator = operator;
    }

}

所以我想知道,是否允许使用我在构造函数中创建的方法。

编辑:我想指出该程序正在运行。我只想知道我是否正确地遵循了 OOP 的规则。

【问题讨论】:

  • 你有什么错误吗?
  • 不,不是真的,除非你必须这样做。这里有一件事,构造函数中使用的方法必须不是多态的,使这些final
  • 我看不出你所做的有什么问题,你的代码至少应该编译和运行。更典型的是,在生产环境中,您可能会看到一些正在记录语句的东西,而不是调用 System.out
  • @Eugene 我认为他实际上不需要调用这些方法,因为它们只是 getter,并且这些值已经作为构造函数的参数可用。因此,唯一的问题是 println 是否是最终/静态的。
  • 恕我直言,我建议您创建一个单独的方法print。因为构造函数必须只创建和初始化对象。而不是打印或做某事。为每个动作创建一个方法。

标签: java oop methods constructor


【解决方案1】:

将对象的行为与创建分开:

public class Calculations {

private int number;
private int multiplier;
private String operator = "";

public Calculations(int number, String operator, int multiplier) {
    this.number = number;
    this.operator = operator;
    this.multiplier = multiplier;
}

public int getNumber() {
    return this.number;
}

public void setNumber(int number) {
    this.number = number;
}

public int getMultiplier() {
    return this.multiplier;
}

public void setMultiplier(int multiplier) {
    this.multiplier = multiplier;
}

public String getOperator() {
    return this.operator;
}

public void setOperator(String operator) {
    this.operator = operator;
}

public void print() {
     switch (getOperator()) {
    case "+":
        System.out.println(getNumber() + getMultiplier());
        break;
    case "-":
        System.out.println(getNumber() - getMultiplier());
        break;
    case "*":
        System.out.println(getNumber() * getMultiplier());
        break;
    case "/":
        System.out.println(getNumber() / getMultiplier());
        break;
    case "%":
        System.out.println(getNumber() % getMultiplier());
        break;
    default:
        System.out.println("Something went wrong.");
    }
}
}

【讨论】:

    【解决方案2】:

    是否允许使用我在构造函数中创建的方法。

    这是允许的,但很危险,因为您需要知道应该设置的所有内容是否已设置。最好使用作为参数传递的值。

    但是您的switch 应该在构造函数中,因为您可以稍后更改运算符或操作数。我会有一个单独的方法。

    注意:有一个名为 multiplier 的字段会令人困惑,因为在大多数情况下它不是乘数。

    【讨论】:

      【解决方案3】:

      是的,这是允许的,但更好的方法是将对象的行为和构造分开。构造函数主要用于设置类的属性。

      【讨论】:

        【解决方案4】:

        为了更好地编写 OOP(面向对象编程)中的代码,您所指的这个概念称为封装。您通常可以按照您所说的方式进行编码。但是,当应用程序变得更大时,如果您遵循既定的设计模式,您的生活会变得更加轻松。请查看此链接以了解封装概念: https://www.tutorialspoint.com/java/java_encapsulation.htm

        【讨论】:

          猜你喜欢
          • 2015-05-08
          • 2012-11-10
          • 2011-06-19
          • 2018-06-30
          • 2013-01-02
          • 2020-07-24
          • 2021-01-08
          相关资源
          最近更新 更多