У меня есть несколько различных представлений одного и того же объекта; назовем это Вещей. «Вещь» - это интерфейс маркера. ThingFormat0, ThingFormat1, ThingFormat2 и т. Д. - все JavaBeans, которые реализуют Thing. (Поскольку они являются JavaBeans, маршаллер JSON автоматически преобразует их в JSON и из него автоматически.) ThingFormat1 имеет всего несколько членов, таких как имя и идентификатор. ThingFormat2 имеет URI-ссылки на другие вещи. В ThingFormat3 есть ThingFormat1 представления этих других вещей и т. Д.Подкласс конечного класса; или, вырожденный декоратор
Серийный анализатор JSON умеет автоматически конвертировать URI. (Он работает для любого класса, где вы можете использовать toString() и конструктор ClassName (String string) для преобразования.)
Я хочу иметь ThingFormat0, который ведет себя как URI, но реализует интерфейс маркера Thing.
public class ThingFormat0 extends URI implements Thing {}
Это не работает, потому что URI является окончательным классом и не может быть подклассифицирован.
Единственный способ, которым я могу это сделать, - сделать декоратор (очень дегенеративный декоратор, поскольку он не добавляет никаких функций для URI). Это легко на некоторых языках с «утиным типом», но больше на боль в Java, потому что я должен обернуть URI и реализовать все методы URI, которые мне нужны. Есть ли более простой способ?
Когда Thing является членом класса Response, сериализация ответа JSON является {"thing": {"uri": "http: // whatever"}} вместо {"thing": "http: // без разницы"}. –