splash Posted August 17, 2013 at 09:31 PM Report #521974 Posted August 17, 2013 at 09:31 PM (edited) 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 Edited August 19, 2013 at 11:56 PM by Baderous geshi
Knitter Posted August 17, 2013 at 10:02 PM Report #521976 Posted August 17, 2013 at 10:02 PM 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 1 Report
splash Posted August 18, 2013 at 12:25 AM Author Report #521980 Posted August 18, 2013 at 12:25 AM 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
Ernest Posted August 18, 2013 at 01:00 AM Report #521983 Posted August 18, 2013 at 01:00 AM (edited) 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 Edited August 18, 2013 at 01:24 AM by Ernest Duarte
KTachyon Posted August 18, 2013 at 01:53 AM Report #521986 Posted August 18, 2013 at 01:53 AM 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
Ernest Posted August 18, 2013 at 02:09 AM Report #521988 Posted August 18, 2013 at 02:09 AM 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
splash Posted August 18, 2013 at 10:35 AM Author Report #521998 Posted August 18, 2013 at 10:35 AM 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.
Knitter Posted August 18, 2013 at 10:37 AM Report #521999 Posted August 18, 2013 at 10:37 AM 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. 1 Report
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now