Pergunta

Eu estou trabalhando em Java em um bastante grande projeto. A minha pergunta é sobre como melhor estrutura o conjunto de propriedades para o meu aplicativo.

Abordagem 1: ter algumas propriedades objeto estático que é acessível por todas as classes. (Desvantagens: então, algumas classes perder sua generalidade que deve ser tomado fora do contexto do pedido; eles também exigem chamadas explícitas para algum objeto estático que está localizado em uma classe diferente e pode no futuro desaparecer, ele só não faz sensação certo, estou errado?)

Abordagem 2: ter as propriedades ser instanciado pela classe principal e para baixo entregue às outras classes de aplicação. (Desvantagens:. Você acaba passando um ponteiro para o objeto Propriedades para quase todas as classes e parece tornar-se muito redundante e pesado; eu não faço como lo)

Todas as sugestões?

Foi útil?

Solução

Eu gosto de usar injeção de dependência da Primavera para muitas das propriedades. Você pode tratar a sua aplicação como blocos de construção e injetar as propriedades diretamente no componente que precisa deles. Isso preserva (encoraja) encapsulamento. Em seguida, você montar seus componentes em conjunto e criar a "classe principal".

Um bom efeito colateral da injeção de dependência é que seu código deve ser mais facilmente testável.

Outras dicas

Na verdade, a abordagem 2 funciona muito bem.

Eu tentei usar um propriedades objeto Singleton em um projeto recente. Então, quando chegou a hora de adicionar recursos, eu preciso rever o Singleton, e lamentou ter que localizar todos os lugares onde eu costumava MySingleton.getInstance().

Abordagem 2 de passar um objeto de informação global através de seus vários construtores é mais fácil de controlar.

Usando um setter explícita também ajuda.

class MyConfig extends Properties {...}

class SomeClass {
    MyConfig theConfig;
    public void setConfi( MyConfig c ) {
        theConfig= c;
    }
    ...
}

Ele funciona bem, e você será feliz que você rigidamente controlado com precisão quais as classes que realmente precisa de informações de configuração.

Se as propriedades são necessários por um monte de aulas, gostaria de ir para a abordagem 1. Ou talvez uma variante em que você usar o padrão de design Singleton em vez de todos os métodos estáticos. Isso significa que você não tem que manter passando algumas objeto de propriedades ao redor. Por outro lado, se apenas algumas classes precisam essas propriedades, você pode escolher abordagem 2, pelas razões que você mencionou. Você também pode querer perguntar-se como provável é que as classes que você escreve são realmente vai ser reutilizados e em caso afirmativo, quanto de um problema que é também reutilizar o objeto propriedades. Se a reutilização não é provável, não se incomode com isso agora e escolher a solução que é o mais simples para a situação atual.

Parece que você precisa de um componente gerenciador de configuração. Ele seria encontrado através de algum tipo de localizador de serviço, o que poderia ser tão simples como ConfigurationManagerClass.instance(). Isso encapsular toda a diversão. Ou você pode usar um quadro de injeção de dependência como Spring.

Muito depende de como componentes encontrar um ao outro em sua arquitetura. Se os seus outros componentes estão sendo passados ??ao redor como referências, fazer isso. Basta ser consistente.

Se você está procurando algo rápido você pode usar as propriedades do sistema, eles estão disponíveis para todas as classes. Você pode armazenar um valor de cadeia ou se você precisa armazenar uma lista de 'coisas' que você pode usar o método () System.Properties. Isso retorna um objeto 'Propriedades', que é um HashTable. Você pode então armazenar o que você quiser na tabela. Não é bonito, mas é uma maneira rápida de ter propriedades globais. YMMV

Eu costumo ir para um objeto singleton que reside em um projeto comum e contém uma tabela hash de si introduzidos no espaço de nomes, resultando em uma classe propriedades para cada um.

Injeção de dependência é também uma boa maneira de fazê-lo.

Eu me sinto mais confortável quando eu tenho um ponteiro estático para minhas propriedades de memória no. algumas vezes você quer propriedades de recarga em tempo de execução, ou outra funcionalidade que é mais fácil de implementar, com uma referência estática.

basta lembrar que nenhuma classe é uma ilha. uma classe reutilizável pode ter uma classe de cliente para manter o núcleo livre da referência singletone.

Você também pode usar interfaces, tente não exagerar.

Approache 2 é defenetly melhor.

De qualquer forma, você não deve deixar que outra pesquisa classe através de objeto de configuração. Você deve INJET configuração tomadas no objeto de configuração ouside o objeto.

Dê uma olhada apache commons configuração para obter ajuda com a configuração Impl.

Assim, no main () você poderia ter

MyObject mobj = new MyObject();
mobj.setLookupDelay(appConfig.getMyObjectLookupDelay);
mobj.setTrackerName(appConfig.getMyObjectTrackerName);

Em vez de

MyObject mobj = new MyObject();
mobj.setConfig(appConfig);

onde AppConfig é um invólucro em torno da biblioteca de configuração do Apache que fazer todo o lookup da base de valor sobre o nome do valor em um arquivo de configuração.

Desta forma o seu objeto tornar-se muito facilmente testável.

Não fizeram Java por um tempo, mas você não pode simplesmente colocar as suas propriedades para as propriedades java.lang.System? Desta forma, você pode acessar os valores de todos os lugares e evitar ter uma classe de propriedade "global".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top