Я столкнулся с некоторым кодом в проекте на работе, где у нас есть JavaBeans. Я обнаружил объект Writer
, который записывает эти компоненты в файл. К сожалению, это использует instanceof
спросить, какой тип фасоль, перед записью в файл, например так:Замена экземпляра для Java Beans
if (bean instanceof BeanA) {
writer.handleBeanA(bean);
} else if (bean instanceof BeanB) {
writer.handleBeanB(bean);
} else if (bean instanceof BeanC) {
writer.handleBeanC(bean);
}
Это некрасиво, и я хочу, чтобы заменить его. Поэтому я взглянул на разделение моего автора на новые классы Writer
, BeanAWriter
, BeanBWriter
, BeanCWriter
. Я сделал это, потому что, очевидно, чтобы сохранить мою структуру JavaBean, я не могу добавить метод write()
в Beans.
Когда я звоню Writer
, я передаю свой bean-компонент в качестве абстрактного родителя Bean
, потому что функции, вызывающей этого автора, не волнует, с каким типом бобов он имеет дело.
Теперь я иду писать свои новые классы я столкнуться с проблемой, то функция, что я переопределение выглядит так:
public abstract boolean <T extends Bean> writeBean(T bean);
но код в BeanAWriter
выглядит следующим образом:
public abstract boolean <T extends Bean> writeBean(T bean) {
bean.accessBeanAProperty();
}
Этот код не может работать, так как T распознается только как Bean
, а не как BeanA
, что означает, что мой instanceof
просто заменен литой до BeanA
...
Может ли кто-нибудь найти решение этого/что здесь происходит не так?
(Я не хочу выкидывать JavaBeans или слышать о том, как это анти-шаблон, так как изменение боба могло бы регрессировать много кода).
как вы пишете их в файле? это текстовый файл? json или что-то еще? –
Писатель будет брать конкретные (разные в зависимости от типа) поля из bean-компонента и построить из него байтовое представление, которое затем сохраняется как текстовый файл. – Rossiar
Зачем писателю нужно так унывать? Ему нужно получить доступ к полям подкласса? – Radiodef