Ответ 1
Вызов toString в коллекции должен возвращать строку, содержащую все представления строк элементов.
Это не будет работать со встроенными массивами, так как у них нет переопределения toString и он просто укажет вам адрес памяти.
В последний раз я спросил, как заполнить структуру данных здесь. Теперь я хотел бы узнать, есть ли что-то в Java, например print_r, который я использую в PHP, чтобы представить то, что я заполнил в Карты и списки без необходимости выполнять собственный алгоритм.
Любые идеи?
Вызов toString в коллекции должен возвращать строку, содержащую все представления строк элементов.
Это не будет работать со встроенными массивами, так как у них нет переопределения toString и он просто укажет вам адрес памяти.
Вы можете попробовать старый добрый Apache Commons Lang ToStringBuilder.
В зависимости от того, что вы хотите сделать, решение может быть довольно простым. Ниже не будет выводиться форматированный вывод, который предоставляет print_r, но он позволит вам выводить структуру списков, массивов и карт:
// Output a list
final List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
System.out.println(list);
// Output an array
final String[] array = {"four", "three", "two", "one"};
System.out.println(Arrays.asList(array));
// Output a map
final Map<String, String> map = new HashMap<String, String>();
map.put("one", "value");
map.put("two", "value");
map.put("three", "value");
System.out.println(map.entrySet());
Для других типов объектов вы можете использовать reflection для создания utility для этой цели.
Существует действительно разница между toString() в java и print_r() в PHP. Обратите внимание, что в php также есть __toString(), что эквивалентно toString() в java, поэтому на самом деле это не ответ.
print_r используется, когда у нас есть структура объектов, и нам нравится быстро видеть полный график объектов с их значениями.
Реализация toString в java для каждого объекта не может сравниться с print_r.
Вместо этого используйте gson. Он выполняет ту же работу, что и print_r
Gson gson = new GsonBuilder(). setPrettyPrinting(). create();
System.out.println(gson.toJson(SomeObject));
Таким образом вам не нужно реализовывать toString для каждого объекта, который вам нужен, чтобы протестировать его.
Вот документация: http://sites.google.com/site/gson/gson-user-guide
Демо-классы (в java):
открытый класс A {
int firstParameter = 0; B secondObject = new B();
}
открытый класс B {
String myName = "this is my name";
}
Вот результат в php с print_r:
Объект
(
[firstParameter: private] = > 0
[secondObject: private] = > Объект B
(
[myName: private] = > это мое имя
))
Вот результат в java с gson:
{
"firstParameter": 0,
"secondObject": {
"myName": "это мое имя"
}
}
Другие упомянули метод toString()
. Это действительно полезно, когда объект реализует toString()
. Если он не был выполнен правильно, вы получите что-то вроде этого: [email protected]
.
Даже если это немного утомительно, все же легко реализовать toString()
в ваших собственных классах, но сторонние классы не всегда будут реализовывать его. Вам гораздо лучше использовать отладчик. Единственная причина, по которой такие вещи, как print_r
, даже существуют в PHP, - это отсутствие реального отладчика. Я думаю, вы обнаружите, что возможность устанавливать точки останова вместо использования набора диагностических операторов печати приведет к значительно более быстрому документообороту и более чистому коду.
Мой выбор для Java print_r
как функция, это класс RecursiveDump, который я написал.
Это не идеально, но он работает хорошо для меня. Использование:
String output = RecursiveDump.dump(...);
Его можно было бы улучшить с помощью дженериков, я написал это много лет назад, прежде чем я узнал о них. Кроме того, в то время как он пытается разобраться с некоторыми типами коллекций, с объектами он просто вызывает метод toString()
.
Я думал использовать Reflection для извлечения имен полей для классов без правильного toString()
, но поскольку Spring Roo @RooToString может написать метод toString()
для вас...
Конечно, альтернативой является использование инспекторского инструмента отладчика, но иногда быстрее использовать отпечатки.
Я не знаю об эквиваленте print_r в java.
Но...
Каждый объект имеет стандартную реализацию метода toString(), реализация списка и карты выводит их содержимое, если вы вызываете toString() для них.
Если вам нужна распечатка отладочной информации, то toString() может быть местом, которое вы ищете.
В Java нет эквивалента для print_r.
Но для карт или списков вы можете использовать foreach-loop следующим образом:
List <String> list = …; // fills your list
// print each list element
for (String s : list) {
System.out.println(s);
}
Для массивов самым простым способом является Arrays.asList(array).toString(). Обычно я использую toString() для объектов, которые мне нравятся в отладочных выводах. Для сгенерированных объектов (JAXB и т.д.), Хотя может потребоваться сделать класс утилиты для его печати.