Java에서 동적 이름으로 변수 할당


96

다음과 같이 Java에서 변수 집합을 할당하고 싶습니다.

int n1,n2,n3;

for(int i=1;i<4;i++)
{
    n<i> = 5;
}

Java에서 어떻게이 작업을 수행 할 수 있습니까?


1
질문을 명확히 해주시겠습니까?
Eng.Fouad

4
지역 변수에 대해이 작업을 수행해야합니까? 배열 요소가 아닌 이유는 무엇입니까?
레이 톨

@ Eng.Fouad : 이름으로 변수에 동적으로 접근하고 싶습니다.
Ashish Anand

답변:


111

이것은 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을 사용하는 경우 바이트 코드 파일에서 변수를 "선언"할 수 있습니다. 하지만하지 마세요! 그 방법은 광기입니다!


1
고맙습니다, 내가 찾던 것을 얻었습니다. 마지막 부분 (Map <String, integer>).
Ashish Anand

1
가능하더라도 실제로 할 일이어서는 안된다는 점에 유의해야합니다. 당신은 그것으로부터 아무것도 얻지 못합니다. 실제로 가독성을 잃게됩니다. 그것들을 연결하고 싶다면 Map<String, T>대신 a 를 사용하고 실제 코드를 엉망으로 시작하지 마십시오.
Jeroen Vannevel

2
@JeroenVannevel - 나는 "광기":-) 무슨 뜻인지 그의
스티븐 C

35

어떤 종류의 동적 변수에 액세스하려면 리플렉션을 사용할 수 있습니다. 그러나 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);
        }
    }
}

이 코드를 다양한 방법으로 개선해야하는 것은 단지 예일뿐입니다. 이것은 또한 좋은 코드로 간주되지 않습니다.


3
Android의 센서 event.values ​​[]를 변수 집합으로 변환해야 할 때 탁월합니다. event.values ​​[]는 1에서 6까지의 길이를 가질 수 있으며 제 경우에는 배열이없는 json 마샬링의 경우 변환하는 것이 편리합니다.
Farshid T 2015

12

필요한 것은 배열입니다. 다음 코드를 작성하고 싶었습니다.

int[] n = new int[4];

for(int i=1;i<4;i++)
{
    n[i] = 5;
}

1
배열을 사용하고 싶지 않습니다. 일부 조건에 따라 변수 (n1, n2, n3)에 동적으로 액세스하고 싶습니다.
Ashish Anand

10

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

7

자바의 동적 변수 이름
그런 것은 없습니다.

귀하의 경우에는 배열을 사용할 수 있습니다.

int[] n = new int[3];
for() {
 n[i] = 5;
}

보다 일반적인 (name, value)쌍의 경우Map<>


4

이 방법을 시도하십시오.

    HashMap<String, Integer> hashMap = new HashMap();

    for (int i=1; i<=3; i++) {
        hashMap.put("n" + i, 5);
    }

4

당신은하지 않습니다. 당신이 할 수있는 가장 가까운 일은 그것을 시뮬레이션하기 위해 맵으로 작업하거나 처리 할 자신의 오브젝트를 정의하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.