Design padrão para estrutura de dados que contém no máximo um item de cada tipo

5

Eu tenho uma superinterface que várias classes abstratas diferentes implementam: Coverage .

Isto é para classificação de seguro. Existem vários tipos de cobertura diferentes e essas coberturas podem variar por estado. O "tipo" de cobertura é uma classe abstrata e, em seguida, as implementações concretas dependem do estado em que quem a compra vive (vários estados geralmente compartilham um desses implementadores concretos).

Basicamente, temos

public interface Coverage {/*...*/}
public abstract class Pip implements Coverage {/*...*/}
public final class FLPip extends Pip {/*...*/}

e depois temos:

public class quote {
    final List<Coverage> coverages;
    // ...
}

Estou pensando que seria bom tê-lo para que a adição de duplicatas de qualquer um dos implementadores diretos de Coverage apresentaria um erro.

Quero dizer, eu poderia fazer algo assim:

abstract class Coverage {/*...*/}

abstract class Pip extends Coverage {/*...*/}

final class FLPip extends Pip {/*...*/}

class Quote {

    // ...

    private final PriorityQueue<Coverage> coverages;
    private final HashSet<Class> coverageTypes;

    // ...

    public void addCoverage(Coverage coverage) {
        Class c = coverage.getClass();
        while(c.getSuperclass() != Coverage.class)
            c = c.getSuperclass();
        if (coverageTypes.contains(c))
            throw new IllegalArgumentException();
        coverageTypes.add(c);
        coverages.add(coverage);
    }

    public void removeCoverage(Coverage coverage) {
        Class c = coverage.getClass();
        while(c.getSuperclass() != Coverage.class)
            c = c.getSuperclass();
        coverageTypes.remove(c);
        coverages.remove(coverage);
    }

    // ...

}

mas isso parece muito "hacky" e propenso a problemas de erro / extensibilidade, e como se eu estivesse perdendo alguma coisa aqui. Alguma idéia sobre um padrão melhor para usar?

    
por Joseph Nields 04.08.2015 / 19:00
fonte

1 resposta

1

Parece que você está procurando um comportamento definido aqui e, de fato, está armazenando os "tipos de cobertura" em HashSet . Você poderia usar um Set para armazenar os objetos Coverage ? Se as próprias implementações Coverage implementarem equals() e hashCode() , então inserir um Coverage em um Set onde ele já estiver presente seria um não operacional.

    
por 09.08.2015 / 20:11
fonte