[java] Java에서 동적 이름으로 변수 할당
다음과 같이 Java에서 변수 집합을 할당하고 싶습니다.
int n1,n2,n3;
for(int i=1;i<4;i++)
{
n<i> = 5;
}
Java에서 어떻게이 작업을 수행 할 수 있습니까?
답변
이것은 Java에서 작업하는 방법이 아닙니다. Java에는 동적 변수가 없습니다. Java 변수는 소스 코드 1 에서 선언해야합니다 .
달성하려는 목표에 따라 배열 a List
또는 a를 사용해야합니다 Map
. 예 :
int n[] = new int[3];
for (int i = 0; i < 3; i++) {
n[i] = 5;
}
List<Integer> n = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
n.add(5);
}
Map<String, Integer> n = new HashMap<String, Integer>();
for (int i = 1; i < 4; i++) {
n.put("n" + i, 5);
}
리플렉션을 사용 하여 소스 코드에서 선언 된 변수 를 동적으로 참조 할 수 있습니다. 그러나이 만 클래스 멤버 인 변수 (예 : 정적 및 인스턴스 필드)에 작동합니다. 지역 변수에는 작동하지 않습니다. @fyr의 “quick and dirty”예제를 참조하십시오.
그러나 Java에서 불필요하게 이런 일을하는 것은 나쁜 생각입니다. 비효율적이며 코드가 더 복잡하며 런타임 검사에 의존하기 때문에 더 취약합니다. 그리고 이것은 “동적 이름을 가진 변수”가 아닙니다. 정적 이름을 가진 변수에 대한 동적 액세스로 더 잘 설명됩니다.
1-그 진술은 약간 부정확합니다. BCEL 또는 ASM을 사용하는 경우 바이트 코드 파일에서 변수를 “선언”할 수 있습니다. 하지만하지 마세요! 그 방법은 광기입니다!
답변
어떤 종류의 동적 변수에 액세스하려면 리플렉션을 사용할 수 있습니다. 그러나 Reflection은 지역 변수에 대해서는 작동하지 않습니다. 클래스 속성에만 적용 할 수 있습니다.
대략적인 빠르고 더러운 예는 다음과 같습니다.
public class T {
public Integer n1;
public Integer n2;
public Integer n3;
public void accessAttributes() throws IllegalArgumentException, SecurityException, IllegalAccessException,
NoSuchFieldException {
for (int i = 1; i < 4; i++) {
T.class.getField("n" + i).set(this, 5);
}
}
}
이 코드를 다양한 방법으로 개선해야하는 것은 단지 예일뿐입니다. 이것은 또한 좋은 코드로 간주되지 않습니다.
답변
필요한 것은 배열입니다. 다음 코드를 작성하고 싶었습니다.
int[] n = new int[4];
for(int i=1;i<4;i++)
{
n[i] = 5;
}
답변
List
또는 array
대신 사용해야 합니다.
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
또는
int[] arr = new int[10];
arr[0]=1;
arr[1]=2;
또는 더 나은
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("n1", 1);
map.put("n2", 2);
//conditionally get
map.get("n1");
답변
자바의 동적 변수 이름
그런 것은 없습니다.
귀하의 경우에는 배열을 사용할 수 있습니다.
int[] n = new int[3];
for() {
n[i] = 5;
}
보다 일반적인 (name, value)
쌍의 경우Map<>
답변
이 방법을 시도하십시오.
HashMap<String, Integer> hashMap = new HashMap();
for (int i=1; i<=3; i++) {
hashMap.put("n" + i, 5);
}
답변
당신은하지 않습니다. 당신이 할 수있는 가장 가까운 일은 그것을 시뮬레이션하기 위해 맵으로 작업하거나 처리 할 자신의 오브젝트를 정의하는 것입니다.