JavaRush /Java блог /Архив info.javarush /10 подсказок по переопределению метода toString() в Java ...
Ku6ep
35 уровень

10 подсказок по переопределению метода toString() в Java (часть 2)

Статья из группы Архив info.javarush

toString примеры в Java

Мы будем использовать следующий класс, что бы продемонстрировать наш toString пример для Netbeans, Eclipse и Apache's ToStringBuilder утилиты.

/** * Java программа, демонстрирующая как переопределить метод toString() в Java. * Эта Java программа показывает как вы можете использовать IDE типа Netbeans или Eclipse * и открытую библиотеку типа Apache commons ToStringBuilder для * переопределения toString в Java. * @author Javarevisited.blogspot.com */ public class Country { private String name; private String capital; private long population; private Date independenceDay; public Country(String name){ this.name = name; } public String getName(){ return name; } public void setName(String name) {this.name = name;} public String getCapital() {return capital;} public void setCapital(String capital) {this.capital = capital;} public Date getIndependenceDay() {return independenceDay;} public void setIndependenceDay(Date independenceDay) {this.independenceDay = independenceDay;} public long getPopulation() { return population; } public void setPopulation(long population) {this.population = population; } @Override public String toString() { return "Country{" + "capital=" + capital + ", population=" + population + ", independenceDay=" + independenceDay + '}'; } public void setIndependenceDay(String date) { DateFormat format = new SimpleDateFormat("dd/MM/yyyy"); try { this.independenceDay = format.parse(date); } catch (ParseException ex) { Logger.getLogger(Country.class.getName()).log(Level.SEVERE, null, ex); } } public static void main(String args[]) { Country India = new Country("India"); India.setCapital("New Delhi"); India.setIndependenceDay("15/07/1947"); India.setPopulation(1200000000); System.out.println(India); } }

Метод toString созданный Netbeans IDE


Метод toString созданный Netbeans IDE создает следующий вывод для определенного выше класс:

Country{capital=New Delhi, population=1200000000, independenceDay=Fri Aug 15 00:00:00 VET 1947}

Если вы посмотрете на приведенный вывод, то увидите, что Netbeans не создает форматированную дату для вас: вместо этого он вызывает метод toString() класса java.util.Date

Метод toString() созданный IDE Rclise


По умолчанию Eclipse создает следующий метод toString:

@Override public String toString() { return "Country [name=" + name + ", capital=" + capital + ", population=" + population + ", independenceDay=" + independenceDay + "]"; }

Вы можете создать код для метода toString в Eclipse нажав на Source --> Generate toString(). Это так же предоставляет несколько возможностей, таких как выбор стиля кода, то есть использование операнда конкатенации или StringBuilder и так далее. Ниже вывод метода toString() который мы только что создали в Eclipse:

Country [name=India, capital=New Delhi, population=1200000000, independenceDay=Tue Jul 15 00:00:00 VET 1947]

Использование ToStringBuilder для переопределения метода Java toString()

Вместе со многими полезными классами, такими как PropertyUtils, EqualsBuilder или HashCodeBuilder Apache так же предоставляет ToStringBuilder который может генерировать код для вывода метода toString() несколькими разными стилями. Давайте посмотрим как выглядит вывод метода toString в простом и много-строчном стиле: Простой стиль:

India,New Delhi,1200000000,Fri Aug 15 00:00:00 VET 1947

Много-строчный стиль:

test.Country@f0eed6[
   name=India
   capital=New Delhi
   population=1200000000
   independenceDay=Fri Aug 15 00:00:00 VET 1947
 ]

NO_FIELD_NAMES_STYLE (стиль без имен полей)

test.Country@1d05c81[India,New Delhi,1200000000,Fri Aug 15 00:00:00 VET 1947]

SHORT_PREFIX_STYLE (стиль с коротким префиксом)

Country[name=India,capital=New Delhi,population=1200000000,independenceDay=Fri Aug 15 00:00:00 VET 1947]

ToStringStyle.DEFAULT_STYLE (стиль по умолчанию)

test.Country@1d05c81[name=India,capital=New Delhi,population=1200000000,independenceDay=Fri Aug 15 00:00:00 VET 1947]

Похожая открытая библиотека от Google - Guava так же предоставляет удобный API для создания кода метода toString в Java.

Когда в Java вызывается метод toString

toString довольно специфичный метод и вызывается из множества JavaAPI методов таких как println(), printf(), журналирование, assert statement, отладчики в IDE, при распечатке коллекций и при конкатенации. Если подкласс не переопределяет toString(), тогда вызывается реализация по умолчанию определенная в классе Object. Многие разработчики используют API для журналирования типа Log4J или java.util.Logger для вывода журналов и часто пропускают здесь Object.

logger.info("Customer not found:" + customer)

и если Customer не переопределяет toString и не выводит важной информации, такой как customerId, customerName и т.д. то довольно трудно будет диагностировать проблему. Это то, почему всегда стоит переопределять toString в Java. Давайте взглянем на некоторые преимущества в случае, если мы будем это делать.

Преимущества переопределения метода toString

  1. Как говорилось выше, правильно переопределенный toString помогает в отладке путем вывода важной информации.
  2. Если важный объект сохранен в коллекции, тогда печать коллекции вызовет toString метод сохраненного объекта, который сможет распечатать важную информацию. Один из классических примеров не переопределенного метода toString это Array в Java, который печатает результат реализации по умолчанию, вместо содержимого массива. Хотя есть несколько способов распечатать содержимое массива с помощью Arrays.toString() и т.п; но поскольку Array является объектом Java, было бы намного лучше, если бы он знал как распечатать себя, так же, как классы коллекций, вроде List или Set.

Это лишь некоторые из преимуществ которые вы получите при реализации или переопределении метода toString в Java, много других преимуществ вы получите и изучите сами. Я надеюсь эти подсказки помогут вам получить большинство ваших реализаций toString. Дайте нам знать если вы знаете какие-то уникальные способы работы с toString которые помогают вам в ваших Java приложениях.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ