2011-07-27 4 views
6

번호를 만들었습니다. 정수 중 1000 개 이상인 정수는 정수입니다.변수의 이름을 출력 할 수 있습니까?

public static final FOO 335343 
public static final BAR 234234 
public static final BEZ 122424 
.... 
.... 
.... 

Java에서 이름의 변수 인 FOO, BAR 및 BEZ를 인쇄하는 방법이 있습니까? 자바 리플렉션에 익숙하지 않습니다. 그게 도움이되는지 나는 모른다. 사실 뒤에이 질문을

if (FOO == 335343) 
    ---> output "FOO" 
if (BAR == 234234) 
    ---> ouptut "BAR" 
.... 

내가

System.out.println("This time the output is " + FOO); 

말과 실제 출력 내가 알고 싶은

This time the output is 335323 

있는 파일에 로그 기록 할 것입니다 변수는 335323에서옵니다. var를 넣는 것 외에 다른 방법이 있습니까? iable 및 그것의 associate 상수를 hashMap에?

감사

+3

왜? 이 작업을 수행함에있어 목표는 무엇이며 코드를 실행하는 데 변수 이름이 중요한 이유는 무엇입니까? 또는 enum을 실제로 사용 하시겠습니까? 나는 현재의 문제에 대한 최선의 해결책이 그것을 완전히 다른 방식으로 해결하는 것이라는 강한 의구심을 갖고 있습니다. 이러한 관점에서 볼 때, 해결하려는 전반적인 문제가 아니라 해결 방법을 알려주는 것이 가장 좋습니다. –

+0

[복제를 통해 Java 정적 final ivar 값에 액세스] 가능한 복제본 (http://stackoverflow.com/questions/850148/accessing-java-static-final-ivar-value-through-reflection) –

+0

@Kit : 아래의 내 답변에서 편집 (편집 1이라고 표시)을 수정하십시오. –

답변

2

당신은 같은 것을 사용할 수 있습니다 : 클래스의 이름을 적어도 하나 개의 인스턴스 필드의 값을 얻기 위해 존재해야한다는 MyClass을 변경하는 것을 잊지 마십시오

for (Field field : MyClass.class.getDeclaredFields()){ 
    if (field.getType().toString().equals("int")){ 
     int val = (Integer)field.get(MyClass.this); 
     switch (val){ 
      case 335343: 
      case 234234: 
       System.out.println(field.getName()); 
     } 
    } 
} 

합니다. 따라서 main 메서드에서 코드를 테스트하려는 경우 MyClass.thisnew Myclass()과 같은 것으로 변경해야합니다. 또 다른 한가지 기억해야 할 것은 필드가 메서드 변수가 아니라 속성이기 때문입니다 (메서드 내에서 선언 된 변수에 액세스 할 때이 메서드를 사용하면 작동하지 않습니다).

+0

지도가 더 좋고 유연하지 않습니까? –

+0

예 (경우에 따라 다름) 그러나이 경우 클래스를 수정하거나 클래스를 열어 특성을 검색 할 때지도를 수정하는 것을 기억할 필요가 없습니다. 어쨌든 코드를 사용하려는 용도에 따라 달라집니다. 메소드가 많이 사용될 경우 getDeclaredFields()의 모든 필드를 기본값과 함께 맵에 추가 할 수 있습니다. – Fido

2

원래 게시물에 대한 내 의견에 언급했듯이 현재 문제의 가장 좋은 해결책은 완전히 다른 방식으로 해결하는 것입니다. int를 String에 연관시키려는 것처럼 보이고이를 수행하는 한 가지 방법은 HashMap과 같은 Map을 사용하는 것입니다. 예를 들어,

import java.util.HashMap; 
import java.util.Map; 

public class MapDemo { 
    public static void main(String[] args) { 
     Map<Integer, String> myMap = new HashMap<Integer, String>(); 
     myMap.put(335343, "FOO"); 
     myMap.put(234234, "BAR"); 
     myMap.put(122424, "BEZ"); 

     int[] tests = {335343, 234234, 122424, 101010}; 

     for (int i : tests) { 
     // note that null is returned if the key isn't in the map 
     System.out.printf("%d corresponds to %s%n", i, myMap.get(i)); 
     } 
    } 
} 

편집 1 :
최근 코멘트를 하고 원래의 질문에 업데이 트, 당신이이 프로그램에 참여 많은 숫자와 관련된 문자열을 가지고 당신의 필요가 있음을 가져가 그 번호에 관련 지을 수 있었던 String를 찾아냅니다. 그렇다면 숫자와 문자열을 프로그램에 하드 코딩해서는 안되며 프로그램의 데이터의 일부로 작성해야합니다 (예 : 한 열이 숫자와 다음 문자가되는 텍스트 파일). 열 (아마도 공백으로 구분), 관련 텍스트. 이렇게하면 데이터를 읽고 HashMap 또는 데이터베이스에서 또는 원하는 방식으로 쉽게 사용할 수 있습니다. 이렇게하면 프로젝트의 유연성과 견고성이 훨씬 향상됩니다.

+0

해시 맵을 사용할 수는 있지만 이미 많은 상수 변수를 이미 선언 했으므로 모든 코드를 하드 코딩하고 해시 맵에 넣고 싶지는 않습니다. –

+0

@Kit : 아직 알려지지 않은 점이 있습니다. 당신이 성취하려는 것. 이 정보가 없으면 어떻게 조언 할 수 있는지 모르겠습니다. –

+0

답변을 업데이트했습니다. 당신의 도움에 감사합니다 –

4

(다른 사람이 말한)이 문제를 해결할 수있는 몇 가지 '특별한 경우'가 있지만 가장 중요한 질문은 다음과 같습니다 (변수 이름 인쇄).

내 경험에 비추어 볼 때 99.9 %의 유사한 질문 (변수 이름을 인쇄하는 방법은 변수 이름을 입력하는 사용자에 따라 결정 되는가?)은 실제로 프로그래밍의 초보자에 의해 제기되었으며 단순히 잘못된 가정과 디자인을 만들었습니다 . 그들이 정상적으로 달성하고자하는 목표는보다 적절한 설계로 수행 될 수 있습니다.


편집 솔직히

난 아직도 당신이 할 길을 가야하는 것입니다 무엇을하려고하는 생각하지 않지만, 적어도 나는 다음은 가능한 대답은 생각 :

이전 답변의 조합입니다.

(컴파일하려고하지는 않았지만 적어도 아이디어가 있습니다.)

class Constants { 
    public static final int FOO = 123; 
    public static final int BAR = 456; 

    private static Map<Integer, String> constantNames = null; 


    public static String getConstantName(int constVal) { 
    if (constantNames == null) { 
     Map<Integer, String> cNames = new HashMap<Integer, String>() 
     for (Field field : MyClass.class.getDeclaredFields()){ 
     if ((field.getModifiers() & (Modifier.FINAL | Modifier.STATIC)) != 0) { 
      && int.class == field.getType()){ 
      // only record final static int fields 
      cNames.put((Integer)field.get(null), field.getName()); 
     } 
     } 
     constNames = cNames; 
    } 
    return constantNames.get(constVal); 
    } 
} 

만 수행하면 상수 이름을 얻으려면 가정 :

Constants.getConstantName(123); // return "FOO" 
+0

@Adrain : 목표를 알려주는 질문을 업데이트하십시오. –

+0

여전히 질문하는 것을 정당화하지 못합니다. 같은 가치를 가진 상수가 2 개있는 경우 어떻게 할 것인가? Java가 어떻게 이러한 문제를 처리해야합니까? 그것은 답변의 업데이 트를 오는 실용적인 방법을 제안합니다하지만 난 여전히 좋은 방법이라고 생각하지 않습니다. –

0

난 당신이 줄 번호가 아닌 변수 이름을 인쇄하는 것이 좋습니다 것입니다. 그렇게하면 메시지가 어디에서 왔는지 판단 할 수 있습니다.

How can we print line numbers to the log in java

+0

정말 아닙니다! 로깅에 사용됩니다. 로그에서 모든 행을 추적하는 것은 문제가 있습니다. –

1

당신은 enum를 사용할 수 있습니다 여기에 그 작업을 수행하는 방법에 대한 자세한 정보입니다. 이 숫자는 단지 고유해야하는 경우

, 당신은

public enum Yourname { 
    FOO, BAR, BEZ 
} 

을 말하고 Yourname.FOO 같은 이름과 Yourname.FOO.ordinal() 같은 값을 참조 할 수 있습니다. if -blocks, switch -statements에 대한 열거 형을 사용할 수 있습니다.

질문에 주어진 숫자를 원할 경우 FOO335343 일 필요가 있으면 번호가 매겨진 열거 형을 만들 수 있습니다. is-it-possible-to-assign-numeric-value-to-an-enum-in-javanumber-for-each-enum-item을 살펴보십시오.

0

각 변수의 이름과 그 값을 인쇄해야하는 int 변수의 긴 목록과 비슷한 문제가있었습니다 (주요 목표는 Excel 파일로 가져올 텍스트 파일을 만드는 것이 었습니다).

불행히도 저는 Java 프로그래밍에있어서 매우 새롭습니다. 그래서 (아마도 잘못된) 유일한 해결책은 두 개의 다른 배열을 사용하는 것입니다 : 문자열 이름에 대한 하나의 문자열 배열과 해당 값에 대한 또 다른 Int 배열. 예를 들어

:

int varName01, varName02, .... 
String[] listNames = new String {"varName01", "varName02", ..... 
int[] listValues = new int {varName01, varName02, ..... 
for (int i=0; i<listValues.length;i++) 
{ 
print String.format("%s %d", listNames[i], listValues[i]); 
} 

아마이 할 수있는 올바른 방법이 아니다, 그래서 일부 자바 전문가로부터 의견을 환영보다 더 될 것입니다. 감사!

관련 문제