Ho un problema di implementazione che ho condensato nel seguente frammento di codice, perché il codice reale è molto più complicato. Il problema principale è che ho un oggetto contenitore con un elenco misto di persone, ad esempio Manager e ingegneri:
interface Person {
}
class Manager implements Person {
}
class Engineer implements Person {
}
Nella maggior parte dei casi devo accedere all'elenco delle persone senza conoscere la sottoclasse concreta di una persona. Ma in alcuni metodi devo conoscere il tipo concreto dei membri, ad esempio per contare i membri o per aggiungere i membri. In entrambe le implementazioni ho un brutto codice:
Nell'implementazione A è il codice per separare i tipi di persone per il conteggio.
class EnterpriseA {
private final List<Person> members = new ArrayList<Person>();
public void addMember(Person person) {
this.members.add(person);
}
public void doSomethingWithManagers() {
// separate by instanceof
}
public void doSomethingWithEngineers() {
// separate by instanceof
}
}
Nell'implementazione B è il codice per aggiungere una persona all'elenco di Manager o Ingegnere.
class EnterpriseB {
private final List<Manager> managers = new ArrayList<Manager>();
private final List<Engineer> engineers = new ArrayList<Engineer>();
public void addMember(Person person) {
if (person instanceof Manager) {
this.managers.add((Manager) person);
} else if (person instanceof Engineer) {
this.engineers.add((Engineer) person);
}
}
public void doSomethingWithManagers() {
// iterate over the managers.
}
public void doSomethingWithEngineers() {
// iterate over the engineers.
}
}
- Come posso migliorare il codice ed evitare il brutto codice in addMember () e countManagers () rispettivamente? I suggerimenti intelligenti sono ben accetti.
- Quale alternativa preferiresti? Si prega di fornire dei motivi, in quali casi si preferirebbe quale soluzione.