开发者

Can I print out the name of the variable?

I have created a no. of 开发者_StackOverflowconstant variables, more than 1000, those constants are unique integer.

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

Is there a way to print out the FOO, BAR and BEZ, the variable of the names in Java? I am not familiar with java reflection. I don't know if that helps.

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

Actually asking this question behind is that I want to write log into the file

say

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

and the actual output is

This time the output is 335323

I want to know which variable comes from 335323. Is there any other way apart from putting those variable and its associate constant into hashMap?

Thanks


There are some 'special case' that u can have workaround for this (which is told by other), but the most important question is: why would you want to do this (printing out variable name)?

From my experience, 99.9% of similar questions (how to print variable name? how to get variable depends on user inputting variable name? etc) is in fact raised by beginner of programming and they simply have made incorrect assumptions and designs. The goal they are trying to achieve normally can be done by more appropriate design.


Edit

Honestly I still do not think what you are trying to do is the way to go, but at least I think the following is a workable answer:

It is more or less a combination of previous answer:

(Haven't try to compile but at least it give u an idea)

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

assuming you want to get a constant name, just do:

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


As I noted in my comment to the original post, I have a strong suspicion that the best solution for your current problem is to solve it in a completely different way. You seem to want to associate an int with a String, and one way to do this is to use a Map such as a HashMap. For e.g.,

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

Edit 1:
Per your recent comments and update to your original question, I take it that you have many numbers and their associated Strings involved in this program and that your need is to find the String associated with the number. If so, then you need to think re-design, that the numbers and their strings should not be hard-coded into your program but rather be part of the program's data, perhaps in a text file with one column being the numbers and the next column (separated by a space perhaps), the associated text. This way you could read in the data and use it easily in a HashMap, or data base, or really any way that you desire. This will give your project much greater flexibility and robustness.


You can use something like:

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

Remember to change MyClass for your class name and that at least one instance should exist to get the value of the field. So, if you are planning on testing the code in a main method, you should change MyClass.this to something like new Myclass(). Another thing to remember is that the fields are attributes and not method variables (so it won't work if you are using this to access variables declared inside a method).


You can use enum.

If these numbers just need to be unique, you can say

public enum Yourname {
    FOO, BAR, BEZ
}

and refer to the name as Yourname.FOO and the value as Yourname.FOO.ordinal(). You can use enums for if-blocks, switch-statements.

If you want to have the numbers you gave in the question, so if FOO needs to be 335343, you can create numbered enums. Have a look at is-it-possible-to-assign-numeric-value-to-an-enum-in-java and number-for-each-enum-item.


I would suggest that you print out the line number, not the variable name. That should give you enough to determine where the message is coming from. Here's more info on how to do that:

How can we print line numbers to the log in java


I had a similar problem with a long list of int variables that I had to print the name of each variable and its value (main goal was to create a text file that was going to be imported in an Excel file).

Unfortunately I'm quite new in Java programming, so the only solution that I found (probably wrong) is to use two different arrays: one String array for the String name and another Int array for the corresponding values.

For example:

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

Probably this is not the correct way to do it, so any opinion from some Java expert would be more than welcome. Thanks!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜