我应该如何在 Java 中初始化一个复杂的实例变量?

Posted

技术标签:

【中文标题】我应该如何在 Java 中初始化一个复杂的实例变量?【英文标题】:How should I initialize a complex instance variable in 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[][] 然后不在构造函数中初始化它,而是在其他地方初始化它?可以吗,不在构造函数中初始化所有实例变量? 由于不同的原因,这三个都很糟糕。您的矩阵类可能不应该负责读取用户输入之类的事情。第一个不复制数组的版本会给您带来一些潜在的讨厌的错误 - 例如,想象一下如果您使用相同的数组创建两个矩阵会发生什么。 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

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

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

就像我们说的一样

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

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

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

【讨论】:

以上是关于我应该如何在 Java 中初始化一个复杂的实例变量?的主要内容,如果未能解决你的问题,请参考以下文章

为什么局部变量没有在Java中初始化?

java中什么是实例变量

请问java构造函数如何初始化成员变量的啊?

java成员变量默认赋值和初始化

python中__init__()括号里面的变量应该如何写,分别表示啥?

java list能赋空值吗