2015-05-12 4 views
2

Я столкнулся с некоторым кодом в проекте на работе, где у нас есть 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 или слышать о том, как это анти-шаблон, так как изменение боба могло бы регрессировать много кода).

+0

как вы пишете их в файле? это текстовый файл? json или что-то еще? –

+0

Писатель будет брать конкретные (разные в зависимости от типа) поля из bean-компонента и построить из него байтовое представление, которое затем сохраняется как текстовый файл. – Rossiar

+0

Зачем писателю нужно так унывать? Ему нужно получить доступ к полям подкласса? – Radiodef

ответ

2

Вы могли бы пойти с классом на основе дженерик, а не метод на основе:

public abstract class BeanWriter<T extends Bean> { 
    public abstract boolean writeBean(T bean); 
} 

public class BeanAWriter extends BeanWriter<BeanA> { 
    public boolean writeBean(BeanA bean) { 
     bean.accessBeanAProperty(); 
    } 
} 
+0

Но предположим, что они даны, например. a "Список '. Теперь они создают писателя для каждого компонента, и им все еще нужно использовать 'instanceof', чтобы выяснить, какой автор должен создать экземпляр. – Radiodef

+0

Это решило! – Rossiar

+0

Для выполнения этой работы с 'List ' вам нужно будет иметь какой-то реестр для отображения класса 'до экземпляров BeanWriter'. –

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