Я создал простой API для преобразования произвольных объектов в понятные человеку строки. Думайте об этом как о обобщенной функциональности String.valueOf()
.
API достигает этого путем выбора
public interface ObjectFormatter {
public String format(Object object);
public Class getObjectClass();
public boolean offer(Object object);
}
в зависимости от метода getClass()
конкретного объекта и последующей передачи объекта в метод format()
. Сопоставление выполняется с помощью простого поиска:
Class clazz = object.getClass();
ObjectFormatter formatter = this.formatters.get(clazz);
if(formatter != null)
return formatter;
Однако это, конечно, работает только в тех случаях, когда класс объекта и класс ключа точно совпадают, но API также должен иметь возможность отображать производные класса ключа (или реализации, если ключ является interface
) в тот же форматер, в противном случае я бы в конечном итоге отобразил Throwable
форматер для каждого возможного класса исключений в моем приложении.
Поэтому, когда вышеупомянутый поиск не удался, мое текущее решение состоит в том, чтобы пройтись по всей карте и спросить каждый модуль форматирования, способен ли он отформатировать мой объект.
Тем не менее, я не слишком доволен этим, и мне интересно, может быть, есть лучший способ.
Что ж, строгий ООП с простым переопределением toString()
и забыванием о форматере будет работать на моих собственных классах, но не работает в сторонних библиотеках, особенно когда конкретная реализация toString()
не содержит желаемой информации объект.