我应该如何在 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 中初始化一个复杂的实例变量?的主要内容,如果未能解决你的问题,请参考以下文章