增强' for'超过班级

时间:2015-03-11 18:14:48

标签: java class for-loop

我有一个关于Java增强'for'语句的问题:

http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.14.2

是否有可能对类使用增强的'for'语句? (而不仅仅是对象)

这是一个例子:

import java.util.*;

class MyRecord
{
  public String name;

  public MyRecord( String name ) {
    this.name = name;
  }
}

class MyCollection implements Iterable<MyRecord>
{
  private static Vector<MyRecord> vec = new Vector<MyRecord>();

  public Iterator<MyRecord> iterator() {
    return vec.iterator();
  }

  public static void add( MyRecord rec ) {
    vec.add( rec );
  }
}

class Test
{
  public static void main( String[] args )
  {
    MyCollection.add( new MyRecord( "first" ) );
    MyCollection.add( new MyRecord( "second" ) );

    for( MyRecord rec : MyCollection ) 
      System.out.println( rec.name );
  }
}

我在'for'中遇到错误:

Test.java: error: cannot find symbol
    for( MyRecord rec : MyCollection )
                        ^
  symbol:   variable MyCollection

如果可能,我想避免创建类MyCollection的实例。

2 个答案:

答案 0 :(得分:0)

实际上,您必须将对象的实例传递给for。如果要阻止创建MyCollection的多个实例,可以使用单例模式。

class MyCollection implements Iterable<MyRecord>
{
    private static Vector<MyRecord> vec = new Vector<MyRecord>();

    private static final MyCollection INSTANCE = new MyCollection();

    private MyCollection() { /* Hide the constructor */ }

    public static MyCollection getInstance() {
        return INSTANCE;
    }

    public Iterator<MyRecord> iterator() {
        return vec.iterator();
    }

    public static void add( MyRecord rec ) {
        vec.add( rec );
    }
}

从这里开始,您可以修改循环代码以使用单例实例

for( MyRecord rec : MyCollection.getInstance() ) 
    System.out.println( rec.name );

答案 1 :(得分:0)

这个解决方案适合我:

try
{
  for( MyRecord rec : MyCollection.class.newInstance() ) 
    System.out.println( rec.name );
}
catch( Exception e )
{
  System.out.println( e );
}