使构造函数的参数可以被类中的不同方法访问的正确方法是什么?
例如,在下面的代码段中,我想在名为 aMethod 的方法中访问 N ,而不更改aMethod的现有参数签名。 myArray.length是最好的选择吗?
public class MyClass{
private int[][] myArray;
public MyClass(int N){
if(N <= 0)
throw new IndexOutOfBoundsException("Input Error: N <= 0");
myArray = new int[N][N];
}
public void aMethod(int i, int j){
// N won't work here. Is myArray.length the best alternative?
if(i <= 1 || i > N)
throw new IndexOutOfBoundsException("Row index i out of bounds");
if(j <= 1 || j > N)
throw new IndexOutOfBoundsException("Column index j out of bounds");
}
}
编辑1 我正在测试大于0的输入,所以如果用户为i输入0或为j输入0,则输入无效。
答案 0 :(得分:5)
只需为它创建一个字段,就像你为数组所做的那样。
public class MyClass{
private int[][] myArray;
private int myArraySize;
public MyClass(int N){
if(N <= 0)
throw new IndexOutOfBoundsException("Input Error: N <= 0");
myArray = new int[N][N];
myArraySize = N;
}
...
}
但是在这种情况下,我不会这样做,我会更改aMethod():
public void aMethod(int i, int j){
// N won't work here. Is myArray.length the best alternative
if(i < 0 || i >= myArray.length )
throw new IndexOutOfBoundsException("Index i out of bounds");
if(j < 0 || j >= myArray[i].length)
throw new IndexOutOfBoundsException("Column index j out of bounds");
}
(我还更改了检查以允许[0..N-1]而不是[1..N],因为数组从0开始索引。)
答案 1 :(得分:3)
为什么不使用数组length
的{{1}}?
答案 2 :(得分:3)
您可以将其存储为另一个字段,但它已存储。
public class MyClass{
private final int[][] myArray;
public MyClass(int n){
myArray = new int[n][n]; // will throw an exception if N < 0.
}
public void aMethod(int i, int j){
int n = myArray.length;
if(i < 0 || i >= n)
throw new IndexOutOfBoundsException("Index i out of bounds");
if(j < 0 || j >= n)
throw new IndexOutOfBoundsException("Column index j out of bounds");
}
}
当然,索引0和1对数组有效。如果你没有执行这些检查,你会得到一个IndexOutOfBoundException,但它会告诉你哪个无效值可能有用。
答案 3 :(得分:2)
创建一个字段(为了天堂的缘故,使用通常的命名约定命名它):
public class MyClass{
private int[][] myArray;
private final int n; // it should be final, because the array has the same dimension
public MyClass(int n){
this.n = n;
// other stuff
}
public void aMethod(int i, int j){
// use n here
}
}
答案 4 :(得分:1)
似乎'N'应存储在班级的成员中。如果你这样做,那么无论如何它也可以被aMethod()方法访问。
在任何情况下,您都应该在构造函数中调用需要构造函数参数的方法,或者将这些构造函数参数存储在成员变量中,并使其可用于其他方法。
答案 5 :(得分:1)
我认为IndexOutOfBoundsException
会在没有引起注意的情况下抛出,因为java check array在运行时绑定。您是否真的需要这个额外的支票?
答案 6 :(得分:1)
在我的 nSize
中添加一个新字段public class MyClass{
private int[][] myArray;
private int nSize;
public MyClass(int N){
if(N <= 0)
throw new IndexOutOfBoundsException("Input Error: N <= 0");
myArray = new int[N][N];
this.nSize= N;
}