如果我有一个类,并且在这个类中有一个构造函数创建一个ArrayList ...什么是将这个arraylist传递给类方法的最佳方法?

时间:2010-11-29 19:26:00

标签: java variables argument-passing

抱歉这个愚蠢的问题,但我似乎无法在谷歌上找到答案。我编写了一个类,在类中有一个构造函数,它创建了一个arraylist,在同一个类中有一个方法,它通过创建一个迭代器对象来遍历数组列表。但是,正如我的代码所示,它不能识别arraylists名称,我应该将数组列表存储在类变量中,还是将其作为参数传递给方法?

这里通常最好的做法是什么,这总是让我感到兴奋?

如果你不能按照我有些愚蠢的解释,我的代码如下!道歉 !非常感谢您阅读:)

import java.util.*;
public class Primes {
  public Primes( int initialCapacity) {
    ArrayList<Integer> listOfPrimeNumbers = new ArrayList<Integer>(initialCapacity);    
    //how do I get the above...
    int index = 2;
    while (index != listOfPrimeNumbers.size())
    {
      if (isPrime(index))
      {
        listOfPrimeNumbers.add(index);  
      }
      index++;
    }
  }
  public static boolean isPrime(int candidateNo) {
    Iterator<Integer> iter = listOfPrimeNumbers.iterator( );
    //in here ! ?
    i=2;
    while ( iter.hasNext( ) ) {
      if (candidateNo%i==0 && i!=1) {
        return false;
      }
      else
        return true;
    }
  }

(另外,如果你看到我的代码出现任何可怕的错误,请不要害怕打电话给我,更有建设性的批评越好!)     }

4 个答案:

答案 0 :(得分:2)

您可以为ArrayList定义一个私有var,并在构造函数中初始化此变量。 现在您可以访问类中的列表:) 希望有所帮助。

import java.util.*;
public class Primes {

  private ArrayList<Integer> listOfPrimeNumbers;

  public Primes( int initialCapacity) {
    listOfPrimeNumbers = new ArrayList<Integer>(initialCapacity);    
    //how do I get the above...
    int index = 2;
    while (index != listOfPrimeNumbers.size())
    {
      if (isPrime(index))
      {
        listOfPrimeNumbers.add(index);  
      }
      index++;
    }
  }
  public static boolean isPrime(int candidateNo) {
    Iterator<Integer> iter = listOfPrimeNumbers.iterator( );
    //in here ! ?
    i=2;
    while ( iter.hasNext( ) ) {
      if (candidateNo%i==0 && i!=1) {
        return false;
      }
      else
        return true;
    }
  }

答案 1 :(得分:1)

listOfPrimeNumbers是一个局部变量。您可以将其更改为类的静态成员,使其成为实例变量并使isPrime成为非静态成员,或将其作为参数传递给isPrime

鉴于这个类的明显意图,我将isPrime设为非静态,并使listOfPrimeNumbers为实例变量。

答案 2 :(得分:1)

你需要重新考虑你的课程如何组合在一起:

  • 在构造函数中完成所有工作通常不是一个好主意。 Java中的构造函数很棘手,通常我会尽量使它们变得简单,并将实际工作转移到其他地方。

  • 静态方法被高估了,我尽量避免它们。如果你有一些数据结构,你希望你的方法访问,使这些方法实例方法,并使数据结构成为实例变量。 Java应该是一种面向对象的语言,使用静态方法可以防止面向对象并限制你的选择。

  • 考虑如何使用该类,以及如何测试它,并更改类实现的API以匹配该类。

答案 3 :(得分:0)

似乎您想将arraylist设置为类成员变量。但是,您将isPrime声明为静态。这两件事在一起没有意义。如果isPrime不需要是静态的,那么只需将arraylist存储为类成员。如果它需要是静态的(无论出于何种原因),你将不需要一个构造函数(因为在这种情况下isPrime是静态的没有意义)并在其他地方创建arraylist并将其作为参数传递to isPrime。

编辑:第二个想法,你不需要isPrime是静态的,它应该是这样的:

public class Primes {
  ArrayList<Integer> listOfPrimeNumbers;
  public Primes( int initialCapacity) {
    listOfPrimeNumbers = new ArrayList<Integer>(initialCapacity);    
    //how do I get the above...
    int index = 2;
    while (index != listOfPrimeNumbers.size())
    {
      if (isPrime(index))
      {
        listOfPrimeNumbers.add(index);  
      }
      index++;
    }
  }
  public static boolean isPrime(int candidateNo) {
    Iterator<Integer> iter = listOfPrimeNumbers.iterator( );
    //in here ! ?
    i=2;
    while ( iter.hasNext( ) ) {
      if (candidateNo%i==0 && i!=1) {
        return false;
      }
      else
        return true;
    }
  }

然而,您似乎还有其他问题。你的构造函数中的while循环将如何结束?您每次都会增加索引,但是如果它是素数,那么您只是在列表中添加一些内容。

在你的isPrime方法中,你的while循环有什么意义?你调用iter.hasNext(),但不要使用迭代的东西。您只需查看candidateNoi