【问题标题】:If I have a class, and within this class there is a constructor creating an ArrayList...whats the best way to pass this arraylist to a class method?如果我有一个类,并且在这个类中有一个构造函数创建一个 ArrayList ......将这个 arraylist 传递给一个类方法的最佳方法是什么?
【发布时间】:2011-05-17 11:23:33
【问题描述】:

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

这里通常最好的做法是什么,因为这总是让我着迷?

如果您不能按照我有点令人费解的解释,我的代码如下!道歉 !非常感谢阅读:)

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

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

【问题讨论】:

    标签: java variables argument-passing


    【解决方案1】:

    你需要重新考虑你的班级是如何组合在一起的:

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

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

    • 考虑一下您希望如何使用该类,以及您希望如何测试它,并更改该类实现的 API 以与之匹配。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 并添加getter方法来获取listOfPrimeNumbers,因为它是私有成员
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-11-24
          • 2021-05-06
          • 1970-01-01
          • 2018-05-29
          • 2013-12-10
          • 1970-01-01
          • 2011-03-09
          相关资源
          最近更新 更多