2013-04-03 1 views
2

Я занимаюсь регистрацией с использованием org.slf4j.Logger в своем коде. Есть места, где это происходит, я хочу видеть содержимое массива, в котором в основном массив строк, массив типов объектов. если типы объектов в основном реализованы с помощью toString().
Есть ли какие-либо apache-утилиты или что-то, что дает массивы понятным строкам?Есть ли какие-либо apache-утилиты, которые печатают массивы, некоторые понятные строки

ответ

4

Как было предложено в другом ответе, вы можете использовать Arrays.toString() для построения «содержательной» строковой презентации для массива. Конечно, предполагается, что вы используете JDK 5+

Еще более «правильный» результат должен использовать Arrays.deepToString(), для которого, если это другой экземпляр массива, содержащийся в массиве, содержащий массив также правильно преобразовывается в строку.

Если вы не используете JDK5 +, в Apache Commons Lang, вы можете использовать ArrayUtils.toString()

Учитывая, что вы упомянули о SLF4J Logger, есть что-то стоит смотреть.

Когда мы используем SLF4J Logger, мы всегда делаем что-то вроде

logger.info("data is {}", data); 

Причины сделать это вместо logger.info("data is " + data); потому, что сообщение журнала может быть отложенным оценено, только если регистратор на самом деле имеет уровень INFO включен. Это особенно полезно, когда сообщение дорого строить.

Однако, просто используя Arrays.deepToString() собирается забрать это преимущество:

logger.info("data is {}", Arrays.deepToString(dataArray)); 

Дорого DataArray для преобразования строки происходит независимо от того, регистратор включен с уровнем INFO.

Для того, чтобы решить эту проблему, вы можете явно проверить уровень регистратора перед входом:

if (logger.isInfoEnabled()) { 
    logger.info("data is {}", Arrays.deepToString(arrayData)); 
} 

Вы также можете рассмотреть возможность помощника, как этот (псевдо-код):

public class ArrayToStringHelper { 
    Object[] arrayData; 
    public ArrayToStringHelper(Object[] arrayData) { 
     this.arrayData = arrayData; 
    } 
    @Override 
    public String toString() { 
     return Arrays.deepToString(arrayData); 
    } 
} 

Так что преобразование Array to String задерживается до тех пор, пока оно не понадобится:

logger.info("data is {}", new ArrayToStringHelper(arrayData)); 
+0

Большое спасибо @Adrian, который объясняет мне, что Я хотел знать. И спасибо за объяснение с подробными образцами кода. – kuhajeyan

1

Нет необходимости в каких-либо библиотеках третьих сторон. Просто используйте Arrays.toString