Могу ли я распечатать имя переменной? - PullRequest
6 голосов
/ 27 июля 2011

Я создал нет.постоянных переменных, больше 1000, эти константы являются уникальными целыми числами.

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

Есть ли способ распечатать FOO, BAR и BEZ, переменную имен в Java?Я не знаком с отражением Java.Я не знаю, помогает ли это.

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. Есть ли другой способ кроме помещения этой переменной и ее ассоциированной константы в hashMap?

Спасибо

Ответы [ 6 ]

4 голосов
/ 27 июля 2011

Существуют некоторые «особые случаи», когда вы можете обойти это (о чем говорят другие), но самый важный вопрос: зачем вам это делать (вывод имени переменной)?

Исходя из моего опыта, 99,9% подобных вопросов (как печатать имя переменной? Как получить переменную зависит от ввода имени переменной, введенного пользователем? И т. Д.) Фактически задаются начинающим программистом, и они просто сделали неверные предположенияи конструкции.Цель, которую они пытаются достичь обычно, может быть достигнута с помощью более подходящего дизайна.


Редактировать

Честно говоря, я до сих пор не думаю,то, что вы пытаетесь сделать, это путь, но, по крайней мере, я думаю, что следующий ответ является работоспособным:

Это более или менее комбинация предыдущего ответа:

(Haven 'не пытайтесь скомпилировать, но, по крайней мере, это даст вам представление)

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"
3 голосов
/ 27 июля 2011

Как я отметил в своем комментарии к исходному сообщению, у меня есть сильное подозрение, что лучшее решение вашей текущей проблемы - это решить ее совершенно другим способом.Кажется, вы хотите связать int со строкой, и один из способов сделать это - использовать карту, такую ​​как HashMap.Например,

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:
В соответствии с вашими последними комментариями и обновлением исходного вопроса, я полагаю, что у вас есть много чисел и связанных с ними строк, участвующих в этомпрограмма и что вам нужно найти строку, связанную с номером.Если это так, то вам нужно подумать о редизайне, чтобы числа и их строки не были жестко запрограммированы в вашей программе, а скорее были частью данных программы, возможно, в текстовом файле, где один столбец - это числа, а следующий -столбец (возможно, разделенный пробелом), связанный текст.Таким образом, вы можете читать данные и легко использовать их в HashMap, или в базе данных, или любым другим способом.Это даст вашему проекту гораздо большую гибкость и надежность.

2 голосов
/ 27 июля 2011

Вы можете использовать что-то вроде:

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

Не забудьте изменить MyClass для вашего имени класса, и для получения значения поля должен существовать хотя бы один экземпляр.Итак, если вы планируете тестировать код методом main, вам следует изменить MyClass.this на что-то вроде new Myclass().Также следует помнить, что поля являются атрибутами, а не переменными метода (поэтому он не будет работать, если вы используете это для доступа к переменным, объявленным внутри метода).

1 голос
/ 03 июля 2015

Вы можете использовать enum .

Если эти числа просто должны быть уникальными, вы можете сказать

public enum Yourname {
    FOO, BAR, BEZ
}

и именовать его как Yourname.FOOи значение как Yourname.FOO.ordinal().Вы можете использовать перечисления для if -блоков, switch -статементов.

Если вы хотите, чтобы числа, которые вы указали в вопросе, поэтому, если FOO должно быть 335343, вы можете создавать нумерованные перечисления.Взгляните на можно ли присвоить числовое значение для перечисления в java и число для каждого перечисляемого элемента .

0 голосов
/ 21 сентября 2016

У меня была похожая проблема с длинным списком переменных int, из-за которых мне приходилось печатать имя каждой переменной и ее значение (основная цель состояла в том, чтобы создать текстовый файл, который собирался импортировать в файл Excel).

К сожалению, я довольно новичок в программировании на Java, поэтому единственное решение, которое я нашел (возможно, неправильно), - это использовать два разных массива: один массив String для имени String и другой массив 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]);
}

Возможно, это неправильный способ сделать это, поэтому любое мнение от какого-либо эксперта по Java будет более чем приветствоваться.Спасибо!

0 голосов
/ 29 июля 2011

Я бы посоветовал вам распечатать номер строки, а не имя переменной. Это должно дать вам достаточно, чтобы определить, откуда приходит сообщение. Вот больше информации о том, как это сделать:

Как мы можем печатать номера строк в журнале Java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...