【问题标题】:How should I initialize a complex instance variable in Java?我应该如何在 Java 中初始化一个复杂的实例变量?
【发布时间】:2017-01-26 15:18:44
【问题描述】:

我正在制作一个名为 Matrix 的课程。它的实例变量应该是它的行数、列数和一个表示矩阵的 2D int 数组(在数学中)。它有方法getDeterminant() 得到它的行列式,它应该能够与另一个矩阵相乘。

我的问题是,在构造函数中,我应该如何初始化它?它是否应该接受预制的二维数组,使其构造函数看起来像:

public class Matrix {
    private int[][] matrix;
    public Matrix(int[][] matrix) {
        this.matrix = matrix;
        //etc.
    }
}

或者它应该在构造函数中创建它,使其看起来像

public class Matrix {
    private int[][] matrix;
    public Matrix(int rows, int columns) {
        Scanner in = new Scanner(System.in);
        //asks the user to input a matrix
    }
    //methods and the such
}

编辑: 或者,我应该有一个像这样初始化它的方法

public class Matrix {
    private int[][] matrix;
    public Matrix() {
        //something else
    }
    public int[][] initializeMatrix(int rows, int columns) {
        //for loop + Scanner nextInt() to ask the user to input matrix
    }
    //methods and the such
}

【问题讨论】:

  • 我会更喜欢 first 选项。
  • 您可以同时创建两者,具体取决于您的选择。我不会将扫描仪的东西放在int, int 构造函数中。在用例中执行此操作,然后通过管道传输用户输入
  • 第一个选项不是很好,但绝对可以。第二个选项很糟糕,永远不应该使用。
  • 我明白了。顺便说一句,@AndrewL。这是否意味着我将声明一个私有 int[][] 然后不在构造函数中初始化它,而是在其他地方初始化它?可以吗,不在构造函数中初始化所有实例变量?
  • 由于不同的原因,这三个都很糟糕。您的矩阵类可能不应该负责读取用户输入之类的事情。第一个不复制数组的版本会给您带来一些潜在的讨厌的错误 - 例如,想象一下如果您使用相同的数组创建两个矩阵会发生什么。

标签: java arrays class instance-variables


【解决方案1】:

一个类应该封装它的实现细节(在本例中是 int[][]),所以我会使用一个带有只获取数组维度的构造函数的版本。

为了修改矩阵,添加相应的setter(例如setValue(int x, int y, int value)。

正如其他人所说,在矩阵类中做 IO 并不是一个理想的解决方案(见Separation of concerns

为了从用户输入初始化矩阵,你应该使用不同的类。 它应该包含用于检索用户输入、解析用户输入和处理错误的逻辑。 然后应该使用 Matrix 类的适当修饰符来创建新的 Matrix 实例。

【讨论】:

    【解决方案2】:

    根据我对您的问题的理解,请检查以下有关构造函数的一些详细信息,

    • Java 中的构造函数是一种特殊类型的方法,用于初始化对象。
    • 构造函数不能有明确的返回类型
    • 有两种类型的构造函数:1。默认 & 2。参数化

    因此,构建正确的构造函数取决于您的要求

    就像我们说的一样

    • 如果要在初始化时为类设置值,则需要采用参数化构造函数并在其中传递矩阵的值。

    • 假设您想让用户在类初始化时传递值,那么您需要在构造函数中请求值,因此您需要对其进行结构化。

    所以它总是取决于我们对如何构造构造函数的要求

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2014-09-14
      • 1970-01-01
      • 2012-09-17
      • 2023-03-14
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多