Can I print out the name of the variable?

后端 未结 6 643
独厮守ぢ
独厮守ぢ 2021-01-12 15:26

I have created a no. of constant variables, more than 1000, those constants are unique integer.

public static final FOO  335343
public static final BAR  2342         


        
相关标签:
6条回答
  • 2021-01-12 15:30

    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

    0 讨论(0)
  • 2021-01-12 15:36

    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.

    0 讨论(0)
  • 2021-01-12 15:39

    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 讨论(0)
  • 2021-01-12 15:46

    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"
    
    0 讨论(0)
  • 2021-01-12 15:50

    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).

    0 讨论(0)
  • 2021-01-12 15:53

    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.

    0 讨论(0)
提交回复
热议问题