2010-06-24 8 views
-1

나는이를 통해 반복되는 많은 TEST 변수가 루프 내부에임의로 변수 이름을 생성 하시겠습니까?

if(condition(TEST) == true){ 

    something (NAME) = new something(this); 

    } 

... 내가 좋아하는 뭔가있어 .. 문제가 생겼어요. 나는 그들 중 얼마나 많은 사람들이 "(NAME)"변수를 필요로 하는지를 모르기 때문에 기본적으로 어떻게 자바를 "on the fly"로 만들어 이러한 변수의 이름을 생성 할 수 있는지 알고 싶다.

감사합니다.

+1

/정말 무엇을 ... – Eiko

+1

정말,이 같은 작업을 수행하기위한 필요가 없습니다 : 경우 (조건 (TEST) == true)를, 그냥 (condition (TEST))이면 충분합니다. – wlk

답변

8

결과를 배열이나 컬렉션에 저장하지 않겠습니까? 가장 가까운 것은 Map입니다. 임의로 String 또는 Integer 키를 생성하여 Something 값의 키로 사용하십시오.

// Before all 
Map<String, Something> myMap = new HashMap<String, Something>(); 

// For each of these 
if(condition(TEST) == true){ 
    String name = "VAR" + Math.random() // Don't remember the syntax here 
    myMap.put(name, new something(this)); 
} 
3

문제를 오해하지 않는 한이 작업을 수행하지 않아도됩니다.

Java의 변수는 어휘가 존재하는 블록에 대해서만 정의된다는 점에서 어휘 적으로 범위가 지정됩니다. 루프를 반복 할 때마다 name 매개 변수는 다른 객체를 참조하며 이전 루프에서 보유한 값의 영향을받지 않습니다.

루프 내에서 작동하려는 속성이있을 때만 루프에 많은 매개 변수가 필요합니다 (하나만 가능할 수도 있음). 모든 경우에 코드를 작성할 때 확실히 알 수 있습니다 (컴파일 타임에) TEST 객체의 (런타임) 번호와 분리됩니다.

0

것은 당신이 그들을 저장하거나 나중에 참조, 그들은 모두 같은 유형있어하지 않는 경우, 당신은 그들 모두에 대해 동일한 변수를 사용할 수 있습니다

// Outside loop ... 
something $name; 

// Inside loop ... 
if(condition(TEST) == true){ 

    $name = new something(this); 

} 
+0

루프 외부에서 변수를 사용하지 않는 경우 변수를 루프 외부에서 선언 할 필요가 없습니다. – dsmith

0

가장 간단한 방법은 ID를 생성하는 (예 :지도)는 AtomicInteger를 사용하는 것입니다.

AtomicInteger counter = new AtomicInteger(); 

Map<String, Something> map = ... 
String id = Integer.toString(counter.getAndIncrement(), 36); 
map.put(id, new Something()); 
// later 
Something s = map.get("0"); 

또는 자연스럽게 색인 된 목록을 사용하는 것이 더 간단합니다.

이 작동하는 방법을 추측의 필요성을 제거 할 실제 코드를 표시
List<Something> list = ... 
list.add(new Something()); 
// later 
Something s = map.get(0); 
관련 문제