2013-09-12 6 views
2

У меня возникла проблема в создании разделенной запятой строки из списка объектов. Проблема объясняется в этой ссылке Convert string in list objects to comma separatedНесколько методов toString?

Я решил это с помощью метода toString. Раньше я использовал метод toString() в качестве строкового построителя для цели отладки. Поскольку я использую его для генерации разделенного запятой значения, я не мог его отлаживать, как и раньше.

Есть ли способ выполнить оба?

+0

используют два метода? –

ответ

7

Должен быть отдельный объект для обработки форматирования. Вот почему вы видите форматирование объектов для дат и чисел в java.text, потому что существует так много разных форматов, вам нужны специальные форматиры, отделенные от объектов данных.

Глядя на то, что toString для, в description given in the javadoc является

Возвращает строковое представление объекта. В общем случае метод toString возвращает строку, которая «текстово представляет» этот объект . Результат должен быть кратким, но информативным представлением , которое легко прочитать человеку. Рекомендуется, чтобы все подклассы переопределили этот метод.

Одерски/Ложка/Веннерс книга Программирование в Scala говорит:

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

Также Effective Java (Пункт 10: Всегда Override toString), кажется, предполагает, что цель ToString является предоставление диагностической информации для разработчиков при отладке или регистрации.

Я бы сохранил реализацию toString, которую вы используете для отладки, и создайте отдельный объект форматирования CSV для работы с генерацией csv. Таким образом, цель toString по-прежнему заключается в отладке, разделение проблем поддерживается между заданием объекта как держателем данных и генерацией CSV.

0

Помимо добавления обработанных строк (например col5.getId() и user.getAddress().getAddress1()) в список, который, вероятно, самый лучший и простой ответ, вы могли бы также написать оболочку, которая подменяет toString:

public class AddressForCsv { 
    private final Address address; 

    public AddressForCsv(Address address) { 
    this.address = address; 
    } 

    @Override public String toString() { 
    return address.getAddress1(); 
    } 
} 

Затем добавьте этот объект-оболочка как ваш «столбец», и ваши данные будут отображаться соответствующим образом.

0

С некоторой гуавой магией и Ломбками (для @Data):

@Data 
public class Employee { 
    private String name; 
    private int age; 
} 

final List<Employee> employees = Lists.newArrayList(new Employee("Emp 1",25), new Employee ("Emp 2",25)); 
final List<Employee> names = Lists.newArrayList(Lists.transform(empList, new Function<Employee, String>() { 
    @Override 
    private String apply(final Employee e) { 
     return e.getName(); 
    } 
})); 
// names = [Emp 1, Emp 2] 
final String output = Joiner.on(", ").join(names); 
// output = "Emp 1, Emp 2" 

Обратите внимание, что Function не должна быть анонимным класс и Employee имеет формируемый обычно toString() (от Ломбок).

Ref: guava, lombok

Смежные вопросы