2015-03-11 3 views
0

У меня есть вопрос относительно Java расширенного «для» заявления:Enhanced «для» над классом

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

Есть ли возможность использовать расширение «для» заявления по классу? (А не только объект)

Вот пример:

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

Я получаю ошибку в строке с «для»:

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

Если это возможно, я хотел бы избежать создания экземпляр класса MyCollection.

+0

Вы можете использовать одноплодный шаблон здесь. –

+0

Есть ли причина, по которой вы не захотите создать экземпляр своего класса? –

+0

'Вектор' - взрыв из прошлого –

ответ

0

Как бы то ни было, вы должны передать экземпляр объекта в for. Если вы хотите предотвратить создание нескольких экземпляров MyCollection, вы можете использовать шаблон singleton.

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); 
0

этого решение работает для меня:

try 
{ 
    for(MyRecord rec : MyCollection.class.newInstance()) 
    System.out.println(rec.name); 
} 
catch(Exception e) 
{ 
    System.out.println(e); 
} 
Смежные вопросы