构造函数的参数可以从另一个方法访问?

时间:2012-08-22 11:42:48

标签: java class

使构造函数的参数可以被类中的不同方法访问的正确方法是什么?

例如,在下面的代码段中,我想在名为 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,则输入无效。

7 个答案:

答案 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;            
 }