Написать toString () раз и навсегда? - PullRequest
6 голосов
/ 18 октября 2011

Я хочу, чтобы все мои классы реализовывали toString() одинаково, используя отражение Java. Есть два способа, которыми я придумал.

  1. Создайте базовый класс, такой как MyObject overriding toString(), и все мои классы расширят его, но я не уверен, будет ли это излишним.

  2. Используйте Eclipse для генерации переопределенного значения toString() для каждого класса. Недостатком является то, что было бы много избыточности кода.

Какой метод предпочтительнее? Если вы используете шаблоны Eclipse, есть ли способ автоматически сгенерировать его, когда вы делаете New> Class, вместо того, чтобы каждый раз выполнять Source> Generate toString ()?

Ответы [ 4 ]

5 голосов
/ 18 октября 2011

Как говорит Харкнесс, используйте commons-lang ReflectionToStringBuilder.

Вместо того, чтобы иметь базовый класс, я бы использовал AOP, такой как aspectj , чтобы внедрить эту реализацию во все ваши классы ввремя компиляции.

Другой вариант - использовать такой инструмент, как ASM , чтобы преобразовывать ваши классы во время компиляции для внедрения методов toString.Оба подхода используют одни и те же базовые концепции, поскольку ASM является более «сырой» версией модификации файла класса.

3 голосов
/ 18 октября 2011

Вариант 1 - действительно плохая идея, потому что он налагает ограничение «является» на ваши реализации без веской причины, и каждый из ваших классов должен наследовать от одного и того же базового класса.Это маловероятно, даже возможно.

Вариант 2 также является плохой идеей - вам придется повторять один и тот же код в каждый класс - кошмар обслуживания и без добавления значения.

Лучшим вариантом является использование служебного класса:

public class MyUtils {

    public static String toString(Object object) {
        // your reflection impl here
    }

}

public class MyClass {

    ...

    public String toString() {
        return MyUtils.toString(this);
    }
}
3 голосов
/ 18 октября 2011

См. ToStringBuilder и его подкласс ReflectionToStringBuilder из Apache Commons Lang . Последнее позволит вам реализовать toString() в основном в базовом классе или добавить его в шаблон:

public String toString() {
    return ReflectionToStringBuilder.toString(this);
}
2 голосов
/ 18 октября 2011

Вы также можете использовать lombok, см .:

http://www.projectlombok.org/features/ToString.html

Если вы заинтересованы в дополнительной генерации всех методов получения, установки, toString, hashCode и equals, вы можете использовать аннотацию @Data, см.

http://www.projectlombok.org/features/Data.html

...