Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

splash

Dúvida sobre código java - uso do static

Mensagens Recomendadas

splash

Tenho várias dúvidas no seguinte código, espero que me possam ajudar. Imaginemos a seguinte classe (esta relacionada com código para android)

public class VeiculoDAO {

private SQLiteDatabase dataBase = null;
private static VeiculoDAO instance;

public static VeiculoDAO getInstance(Context context) {
    if(instance == null)
        instance = new VeiculoDAO(context);
    return instance;
}

private VeiculoDAO(Context context) {
    PersistenceHelper persistenceHelper = PersistenceHelper.getInstance(context);
    dataBase = persistenceHelper.getWritableDatabase();
}

...
}

O construtor (único) é privado!

Existe uma váriavel de instância static para a propria classe, para que??????

Existe um getInstance static que retorna a instacina referida acima?????

As minhas dúvidas:

- Como isso esta a funciona? Porque funciona?

- Como usar isso? Criar objectos da classe?

Obrigado

Editado por Baderous
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

De forma resumida essa é a implementação mais simples e típica do padrão Singleton, e a ideia é que não crias várias instâncias dessa classe, crias apenas uma que se manterá durante toda a execução do programa. Se reparares, o método que dá acesso à instância privada é estático, assim usas apenas o nome da classe para invocar o método. Esse método cria a instância uma única vez (teoricamente, na prática isso pode falhar) usando o construtor privado. Como o construtor é privado apenas pode ser invocado pelo código da própria classe.

Alguma informação sobre Singleton, http://en.wikipedia.org/wiki/Singleton_pattern

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
splash

Obrigado Knitter, era mesmo isso.

Eu desconfiava que isso fosse funcionar dessa forma, mas desconhecia o padrão Singleton, e como gosto de perceber as coisas e não apenas por a funcionar decidi perguntar por aqui, já que não estava a encontrar nada.

Estive a ler sobre o assunto e recomendam fazer synchronized no método do getInstance para o caso de um programa com várias threads. (Fica a dica)

Para completar a tua recomendação, deixo aqui um artigo bastante interessante e completo: http://java.dzone.com/articles/singleton-design-pattern-%E2%80%93

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Ernest Duarte

Bom dia,

Resposta direta e simples para iniciantes :

Efetivamente esse código permite a implementação de Design Pattern (padrão de concepção ou modelo de concepção) chamado Singleton.

O Singleton faz parte dos Design Pattern de construção (Creational Design Patterns).

O Design Pattern Singleton garante que a classe tenha uma única instância (graças ao código if(instance == null))

e por outro lado fornece um ponto único de acesso a essa instância ( graças ao método static getInstance).

Resposta para ir mais longe no desenvolvimento JAVA.

Desenvolver e arquitetar uma aplicação corretamente é saber como usar os Design Patterns e os conceitos de base da Object-oriented programming (OOP) : herança, polimorfismo, links dinâmicos (dynamic binding), modularidade e encapsulamento...

Para compreender você tem que saber que a engenharia de software é inspirado na construção civil.

Há muitas semelhanças entre os dois engenharia de software e construção civil.

Por exemplo o inventor dos catálogos de Design Patterns foi Christopher Alexander um arquiteto na construção civil.

http://en.wikipedia.org/wiki/Christopher_Alexander

Os Gang of Four (GoF) quando escreveram o livro de referencia dos Design Patterns inspiraram-se no trabalho de Christopher Alexander.

Nome do livro : Design Patterns: Elements of Reusable Object-Oriented Software

Esta questão é fondamentale para compreender a construção de un sistema de software :

Qual é a diferença entre um programador um desenvolvedor e um arquiteto ?

(Infelizmente a palavra desenvolvedor não existe no meu corretor ortográfico Português de Portugal mas existe no corretor ortográfico Português do Brasil)

Talvez por que para alguns "programmer" e "developer" é a mesma coisa ?

What is the difference between a programmer and a developer and a architect ?

O programador é o pedreiro que sabe as regras da linguagem a sintaxe e algoritmia mas não tem uma visão tão larga do sistema como o desenvolvedor ou um arquiteto. Isto é uma definição segundo as categorias defenidas pela SUN e agora pela ORACLE para passar a Java Certification programmer , developer e architect.

Dito de outra maneira um programador talvez não necessita conhecer os Design Patterns mas o desenvolvedor ou um arquiteto sim.

Para compreender os Design Patterns você tem que imaginar a engenharia de software como a construção civil.

Quando você constrói uma casa você precisa pedreiros (programadores), gerentes de projetos (desenvolvedores) e arquitetos (arquitetos).

Depois os gerentes de projetos (desenvolvedores) e arquitetos (arquitetos) precisão de padrões de conceção para a estrutura da casa (Structural Design Patterns) de construção dos elementos casa (Creational Design Patterns) e também precisa de definir o comportamento da casa (Behavioral Design Patterns).

O comportamento da casa é por exemplo o facto que a mesma casa pode ter um comportamento diferente escola, clinica, moradia, etc...

.................

Eu não entendi a citação de Knitter : [ Esse método cria a instância uma única vez (teoricamente, na prática isso pode falhar) usando o construtor privado.]

Para mim nunca falhou o Singleton na prática e muito menos na teoria por que foi pensado teoricamente para nunca acontecer na pratica ...

Os Design Patterns podem ser usados em qualquer linguagem OOP então não dependem de uma linguagem particular. Pode ser que em algumas linguagens informáticas OOP falhe mas em JAVA nunca falha quando o programa é bem concebido e implementado.

Se a classe for carregada pelo mesmo classe loader e mais do que um Thread tenta aceder ao método de construção então a classe será instanciada pela primeira vez uma vez por todas. A não ser que a operação if (...) não seja atómica.

Frase de splash : [ Existe uma váriavel de instância static para a propria classe, para que?????? ]

Uma váriavel de instância nunca pode ser static por que quando uma variável é static então ela é chamada de variável de classe.

Claro o nome da variável é instance mas a variável é de classe porque static.

Para conhecer os famosos 23 Design Patterns dos GOF :

http://objetjava.free.fr/JavaSE/formationJAVA/designpatternscard.pdf

Cordialmente

Ernest Duarte

Editado por Ernest Duarte

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Qual é a diferença entre um programador um desenvolvedor e um arquiteto ?

(Infelizmente a palavra desenvolvedor não existe no meu corretor ortográfico Português de Portugal mas existe no corretor ortográfico Português do Brasil)

Talvez por que para alguns "programmer" e "developer" é a mesma coisa ?

Em Portugal penso que a distinção é entre programador e engenheiro de software (onde developer ou software developer e software engineer significam a mesma coisa).


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Ernest Duarte

Bom dia KTachyon,

Muito obrigado pelas informações interessantes. Compreender e fazer a distinção das diferentes noções me parece importante.

Cordialmente

Ernest Duarte

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
splash

Obrigado Ernest Duarte a sua resposta vai ajudar bastante.

Tem razão quando diz que uma variável static não é uma variável de instância mais sim de classe, pois quando criamos um objeto dessa classe essa variável não fará parte exclusivamente desse objeto (mas sim da classe), foi uma gralha da minha parte.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Eu desconfiava que isso fosse funcionar dessa forma, mas desconhecia o padrão Singleton, e como gosto de perceber as coisas e não apenas por a funcionar decidi perguntar por aqui, já que não estava a encontrar nada.

Padrões de desenho não são fáceis de explicar num tópico do fórum (e eu há muito que passei a respostas mais curtas e directas), mas recomendo que invistas algum tempo a perceber os padrões mais usados e a perceber onde os usar e, muito importante, onde não os usar. O abuso do padrão Singleton é um exemplo clássico de como algo com alguma utilidade é transformado em fonte de problemas e má estruturação de código.

Quanto a este padrão em particular, o uso de sincronização é útil mas podemos evitar a sincronização a cada acesso (se existirem muitos acessos) fazendo uma iniciação estática. Trocamos controlo no acesso pelo controlo da JVM ao carregar a classe. O artigo que indicaste menciona um problema com o clone que não acontece a não ser que implementes o método clone, já que a implementação por omissão faz apenas a cópia de referências, logo ficas com duas referências para a mesma instância e não duas instâncias diferentes.

Uma nota também importante, embora em Android isso não se verifique com tanta facilidade, é que em Java as classes são carregadas por um class loader e podem existir vários class loaders por aplicação, isto implica que podes ter várias instâncias diferences da classe que pensavas ser Singleton, na prática terás uma instância por cada class loader que executar. Não é comum isto acontecer em Android nem em aplicações para desktop, onde normalmente só existe um class loader por JVM, mas acontece em aplicações JEE onde vários class loaders podem existir no arranque de uma aplicação.

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.