



Вызов toString в коллекции должен возвращать строку, содержащую все строковые представления элементов.
Однако это не будет работать со встроенными массивами, поскольку они не имеют переопределения toString и просто дадут вам адрес памяти.
@trusktr Для пользовательских классов вы должны переопределить метод toString(), чтобы он возвращал то, что вы хотите.
Я не знаю эквивалента print_r в java.
Но...
Каждый объект имеет реализацию по умолчанию для метода toString (), реализации списка и карты распечатывают их содержимое, если вы вызываете для них toString ().
Если вам нужна распечатанная отладочная информация, возможно, вы ищете toString ().
Вы можете попробовать старый добрый Apache Commons Lang's ToStringBuilder.
В Java нет эквивалента print_r.
Но для карт или списков вы можете использовать цикл foreach следующим образом:
List <String> list = …; // fills your list
// print each list element
for (String s : list) {
System.out.println(s);
}
вы также можете использовать для этого итератор .. List <String> list = ...; Итератор итератор; итератор = list.iterator (); while (iterator.hasNext ()) {System.out.println (iterator.next () + ","); }
цикл foreach в java (в любом случае IMO) намного более чистый синтаксис, чем итераторы, и я считаю, что он в любом случае использует итераторы под поверхностью.
Для массивов проще всего использовать Arrays.asList (array) .toString (). Обычно я использую toString () для объектов, которые мне нравятся при отладке. Однако для сгенерированных объектов (JAXB и т. д.) Может потребоваться создать служебный класс для его печати.
В Java 1.5 вместо этого можно использовать Arrays.toString (array).
Другие упомянули метод toString(). Это действительно полезно только тогда, когда объект реализует toString(). Если он не был реализован должным образом, вы получите что-то вроде этого: java.lang.Object@1b9240e.
Даже если это немного утомительно, все же легко реализовать toString() в ваших собственных классах, но сторонние классы не всегда будут его реализовывать. Намного лучше использовать отладчик. Единственная причина, по которой такие вещи, как print_r, вообще существуют в PHP, - это отсутствие настоящего отладчика. Я думаю, вы обнаружите, что возможность устанавливать точки останова вместо использования набора диагностических операторов печати приведет к гораздо более быстрому рабочему процессу и более чистому коду.
привет, приятель :) Да, я хотел что-то вроде print_r, потому что я не думал об использовании отладчика, поскольку, как вы сказали, я никогда не использовал его с PHP. Я посмотрю, как я могу использовать отладчик с Java! :)
Приличный набор журналов неоценим при использовании с отладчиком, поскольку он позволяет вам отследить определенную функцию намного быстрее, чем переходить через отладчик. Ведение журнала также полезно в коде производственного режима, поскольку часто это единственная запись о проблеме.
В зависимости от того, что именно вы хотите сделать, решение может быть довольно простым. Следующее не будет производить форматированный вывод, который предоставляет 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());
Для других типов объектов вы можете использовать отражение, чтобы создать утилита для этой цели.
На самом деле существует разница между 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):
public class A {
int firstParameter = 0; B secondObject = new B();}
public class B {
String myName = "this is my name";}
Вот результат на php с print_r:
Object
(
[firstParameter:private] => 0
[secondObject:private] => B Object
(
[myName:private] => this is my name
))
Вот результат в java с gson:
{
"firstParameter": 0,
"secondObject": {
"myName": "this is my name"
}
}
хороший способ сделать это. Но одно: мне нужен более простой способ сделать это без какой-либо сторонней библиотеки.
Я считаю, что функциональность, подобная Java print_r, - это класс Рекурсивный дамп, который я написал.
Это не идеально, но мне это нравится. Использование:
String output = RecursiveDump.dump(...);
Его можно улучшить с помощью дженериков, я написал это много лет назад, еще до того, как узнал о них. Кроме того, пока он пытается иметь дело с некоторыми типами коллекций, с объектами он просто вызывает метод toString().
Я думал использовать Reflection для извлечения имен полей для классов без надлежащего toString(), но поскольку Spring Roo@RooToString может написать для вас метод toString() ...
Конечно, альтернативой является использование инструмента инспектора отладчика, но иногда быстрее использовать распечатки.
Я пробовал это в пользовательском классе, и он выводит
ClassName@<address_value>. Что использовать в настраиваемом классе?