Статьи

Рефакторинг-безопасный ToStringBuilder

Мы в GridGain недавно столкнулись с проблемой — как сделать наши методы toString () рефактор-безопасными?
До недавнего времени мы использовали простые плагины toString () для IDEA и Eclipse (Jutils), которые автоматически генерировали метод toString () на основе полей класса. Тогда разработчику придется настроить сгенерированный код, чтобы удалить поля, которые не должны быть включены.

Однако, столкнувшись с многочисленными вопросами поддержки, мы заметили, что иногда во время рефакторинга разработчик может забыть добавить новое поле в существующий метод toString () или распечатать слишком много и загромождать журнал. Удивительно, но нет библиотеки с открытым исходным кодом, которая бы поддерживала эту базовую функциональность ( ToStringBuilder от Apache даже не близко), поэтому нам пришлось реализовать нашу собственную. Итак, подведем итог: нам нужна была следующая функциональность:

  • Убедитесь, что новые поля включены автоматически.
  • Убедитесь, что некоторые классы, такие как Object, Collection, Array, автоматически исключаются.
  • Предоставьте переопределения на уровне класса правил по умолчанию, которые будут включать автоматически исключаемые поля и наоборот.
  • Обеспечить поддержку пользовательского упорядочения полей в выводе toString ().

Вот дизайн, который мы выпустили:

Аннотация @GridToStringInclude Эта аннотация может быть прикреплена к любому полю в классе, чтобы обеспечить его автоматическое включение, даже если оно исключено по умолчанию.

Аннотация @ToStringExclude Эта аннотация может быть прикреплена к любому полю в классе, чтобы обеспечить его автоматическоеисключение,даже если оно включено по умолчанию.

@ToStringOrder (int) Аннотация Эта аннотация обеспечивает пользовательский порядок полей класса. Поля с меньшим значением порядка будут раньше в выводе toString (). По умолчанию порядок совпадает с порядком объявлений полей в классе.

Класс ToStringBuilder Этот класс отвечает за рефлексивный анализ всех полей в иерархии классов, кэширование всех аннотаций по соображениям производительности и правильное отображение содержимого toString ().

Итак, вот пример класса, который использует эту простую структуру:

public class MySimpleClass {
/**
* This field would be included by
* default, but is excluded due to
* @ToStringExclude annotation.
*/
@ToStringExclude
private int intField = 1;

/**
* This field will be included
* first for toString() purposes.
*/
private String strField = "TestString";

/**
* This array field would be excluded
* by default, but is included due to
* @ToStringInclude annotation.
*/
@ToStringInclude
private int[] intArr = new int[] { 1, 2, 3 };

/**
* This field is excluded by default.
*/
private Object obj = new Object();

/**
* Generic toString() implementation.
*/
@Override
public String toString() {
return ToStringBuilder.toString(MySimpleClass.class, this);
}
}

Вывод toString () класса выше будет выглядеть следующим образом:

MySimpleClass [strField = TestString, intArr = {1,2,3}]

Полный исходный код доступен в нашей общедоступной WebSVN . При нажатии на эту ссылку вам будет предложено всплывающее окно входа в систему. Просто введите «гость» для имени пользователя и оставьте пароль пустым. Исходный код находится в пакете org.gridgain.grid.utils.toString .

Наслаждайтесь!