Estou programando em J2EE?

47 respostas
R

Utilizo no desenvolvimento de minhas webapps Hibernate(c/ mapeamento) + Struts 2 + JSP + e os Padrões Singleton, DAO e Factory…

a dúvida é se isto se caracteriza em um desenvolvendo na plataforma J2EE…

ou melhor, quais padrões de projeto definem a plataforma? preciso utilizar todos do Core J2EE para dizer q desenvolvo em J2EE?

Grato

Rafael Oliveira

47 Respostas

R
A

rafoli:
Utilizo no desenvolvimento de minhas webapps Hibernate(c/ mapeamento) + Struts 2 + JSP + e os Padrões Singleton, DAO e Factory…

a dúvida é se isto se caracteriza em um desenvolvendo na plataforma J2EE…

ou melhor, quais padrões de projeto definem a plataforma? preciso utilizar todos do Core J2EE para dizer q desenvolvo em J2EE?

Grato

Rafael Oliveira

Não. Se não tem App Server, não é J2EE.

cassio

Taz:
rafoli:
Utilizo no desenvolvimento de minhas webapps Hibernate(c/ mapeamento) + Struts 2 + JSP + e os Padrões Singleton, DAO e Factory…

a dúvida é se isto se caracteriza em um desenvolvendo na plataforma J2EE…

ou melhor, quais padrões de projeto definem a plataforma? preciso utilizar todos do Core J2EE para dizer q desenvolvo em J2EE?

Grato

Rafael Oliveira

Não. Se não tem App Server, não é J2EE.

Discordo. Um servidor de aplicação apenas administra os recursos pra você. O fato de se ter uma aplicação distribuída, que se utiliza de recursos para troca de mensagens (como protocolos de comunicação) é inerente à aplicação e não se deve ao servidor de aplicações.

sergiotaborda

rafoli:
Utilizo no desenvolvimento de minhas webapps Hibernate(c/ mapeamento) + Struts 2 + JSP + e os Padrões Singleton, DAO e Factory…

a dúvida é se isto se caracteriza em um desenvolvendo na plataforma J2EE…

ou melhor, quais padrões de projeto definem a plataforma? preciso utilizar todos do Core J2EE para dizer q desenvolvo em J2EE?

Não.
Usar JEE começa com usar uma Application Server. Não apenas um web container como o tomcar. JSP é uma parte da JEE. Outras partes são JMS , JCA , JavaMail , JTA , JNDI e EJB. Estas tecnologias podem funcionar sozinhas ou em grupos, mas apenas se funcionarem juntas vc está usando JEE. Caso contrário vc está usando apenas o que está usado. No seu caso vc está usando JSP (e portanto servlets e portanto web container) Só. Não a JEE como uma unidade.
Poderiamos argumentar que é impossivel usar a JEE toda e portanto, da mesma forma que usar Swing já é usar JSE e usar midlets já é usar JME , então JSP já seria JEE. Mas não é assim que a difinição é construida. PAra ser JSE basta existir e não ser limitada (como a JME) PAra ser JEE tem que estar dentro da especificação da JEE. JEE não é só uma tecnlogia ou um bando de API, nem é um bando de padrões (aliás padrões não têm nada a ver com a assunto) , JEE é uma especificação.
Básicamente é um problema semântico, portanto, não, vc não pode dizer que está usando JEE.

R

necessáriamente para se caracterizar J2EE precisa de um servidor de aplicação?, como o JBoss?
utilizar os design patterns que o core J2EE especifica não é o suficiente?..

Na verdade o que é necessário (não todos, mas o q caracteriza) para se ter uma aplicação sob a plataforma J2EE?

R

a dúvida surgiu pq vejo uns programadores dizendo que programam em J2EE, ou então vagas de emprego para J2EE,

daí fico sem saber o que preciso saber para me candidatar a uma vaga ou então dizer que programo em J2EE…

preciso saber de tecnologias ou designs patterns?

cv1

Sinto muito, mas enquanto vc nao aprender a viver sem detestar cada um dos malditos singletons que vc ja escreveu, e viver em arrependimento de ter cometido tal atrocidade, vc nao deveria estar mandando curriculo pra ninguem alem do pessoal da producao do Trem da Alegria.

sergiotaborda

rafoli:
a dúvida surgiu pq vejo uns programadores dizendo que programam em J2EE, ou então vagas de emprego para J2EE,

daí fico sem saber o que preciso saber para me candidatar a uma vaga ou então dizer que programo em J2EE…

preciso saber de tecnologias ou designs patterns?

  1. As empresas não sabem o que “JEE” significa (Repare, já se chama JEE e elas continuam pedindo J2EE) Normalmente para elas JEE significa algo como
    a) EJB
    b) Desenvolvimento Web
    c) Application Server
    d) Uma combinação das anteriores

  2. Programadores que dizem que programam em JEE não o fazem realmente. (quem o faz realmente não precisa dizer)

  3. O que vc precisa saber para não ter duvidas que sabe JEE (por ordem de importância)
    a) EJB
    b) JSP (sem script inclusos, i.e Taglibs)
    c) Servlet API
    d) JMS
    e) JNDI
    f) JTA
    g) JCA
    h) JAAS

Metada dizem respeito a conhecer interfaces e especificações e não implementações.

  1. Mais uma vez: Não ha design patterns envolvidos em poder dizer que sabe JEE. Saber aplicar design patterns é saber aplicar design patterns.
    Design patterns não são java. São genéricos. O mesmo padrão pode ser usado em .NET por exemplo. A diferença é a implementação do padrão, não o padrão em si. (Dois círculos de cor diferente continuam sendo dois circulos.)
    Existem padrão especiais que se usam com JEE, existem. è bom conhecer ? sim. É essencial ? não. Aliás EJB 3 é uma evolução porque embute vários dos padrões que os programadores usavam, então é necessário saber menos padrões.

Um coisa que é bom tb saber, em JEE ,mas em Java em geral são Design Principles (não patterns, principles) como Encapsulamento, Separação de Responsabilidade (Separation of Concerns) e Inversão de Controle (Inversion of Control)

LuizAvila

sergiotaborda:

  1. As empresas não sabem o que “JEE” significa (Repare, já se chama JEE e elas continuam pedindo J2EE)

Quase, o correto é “Java EE”

http://java.sun.com/javaee/

R

sergiotaborda muitíssimo grato pelas informações…

Abraços

Rafael Oliveira

Kenobi

Realmente, só o fato de você usar JSP , Struts , baseado em Servlets já é parte da especificação Enterprise.

Agora se você está desenvolvendo certo ou não, aí é outro tema :slight_smile:

Lembrando que TomCat é ApplicationServer e atende “parte” da especificação JEE.

pcalcado

Não acredite em definições rígidas do que é uma aplicação Java EE, esta definição não existe. Para o mercado uma aplicação é Java EE se ela usa alguma das especificações que são parte da plataforma (por exemplo, se usa Servlets, ou se usa JMS). Dizer que um Application Server Java EE completo é necessário para utilizar Java EE não tem fundamento, uma aplicação que use todos os recursos de Java EE seria um monstro sem nenhuma coesão e se ela não utilizar todas as especificações ela não rpecisa de um AS completo. Normalmente você vai utilizar apenas um ou mais containeres.

Agora, antes de pensar em mais qualquer coisa remova TODOS os singletons deste sistema.

A

Legal Rafael,

a definição do Wiki deixa claro:

wiki:
“Java Platform, Enterprise Edition or Java EE is a widely used platform for server programming in the Java language. It is the Java Platform used to deploy fault-tolerant, distributed, multi-tier Java software, based largely on modular components running on an application server.”

Usar uma parte de Java EE, não é usar Java EE. :wink:

R

Legal Rafael,

a definição do Wiki deixa claro:

wiki:
“Java Platform, Enterprise Edition or Java EE is a widely used platform for server programming in the Java language. It is the Java Platform used to deploy fault-tolerant, distributed, multi-tier Java software, based largely on modular components running on an application server.”

Usar uma parte de Java EE, não é usar Java EE. :wink:

www.google.com , melhorou ? :wink:

guilherme.chapiewski

Legal Rafael,

a definição do Wiki deixa claro:

wiki:
“Java Platform, Enterprise Edition or Java EE is a widely used platform for server programming in the Java language. It is the Java Platform used to deploy fault-tolerant, distributed, multi-tier Java software, based largely on modular components running on an application server.”

Usar uma parte de Java EE, não é usar Java EE. :wink:

“Usar uma parte de Java EE, não é usar Java EE.”

???

Então se você come três bananas você não está comendo frutas, você precisa comer TODAS ELAS para comer frutas?

guilherme.chapiewski

Legal Rafael,

a definição do Wiki deixa claro:

wiki:
“Java Platform, Enterprise Edition or Java EE is a widely used platform for server programming in the Java language. It is the Java Platform used to deploy fault-tolerant, distributed, multi-tier Java software, based largely on modular components running on an application server.”

Usar uma parte de Java EE, não é usar Java EE. :wink:

“Usar uma parte de Java EE, não é usar Java EE.”

???

Então se você come três bananas você não está comendo frutas, você precisa comer TODAS ELAS para comer frutas?

Eu lí, re-lí e lí mais uma vez para ter certeza de que eu não estava tendo uma ilusão de ótica.

Taz, você não entendeu o que você leu.

Existem várias tecnologias que formam J2EE. Algumas delas são Servlets, JMS, EJB, etc. Usar qualquer uma delas significa que você está usando J2EE/JEE/whatever.

Se para ter uma aplicação J2EE fosse necessário usar TODAS as tecnologias contidas na plataforma, eu diria pra você que desconheço uma aplicação que utilize J2EE e que só existem meia dúzia delas no mundo todo. E seguindo essa mesma linha de raciocínio, eu desconheço também uma aplicação Java JSE já que dificilmente uma aplicação sozinha usa todas as features desta plataforma.

Agora me responda uma pergunta: se minha aplicacao nao usa TUDO de JSE e nem TUDO de JEE ela é o que?

bebad

hahahahaa
owned!!! :arrow: :arrow: :arrow:


hmmm sua app seria java ?

relaxa, oque importa se vc ta desenvolvendo jse ou jee, se o rh da empresa nao sabe nem oque é um container web ?
vai de voce, explicar pra ele e vender seu peixe. :wink:

I

nao entendo porque jogam tanta pedra nos sigletons :?

eu acredito que ele tem sua utilidade.
:stuck_out_tongue:

guilherme.chapiewski

immortalSoul:
nao entendo porque jogam tanta pedra nos sigletons :?

eu acredito que ele tem sua utilidade.
:stuck_out_tongue:

Sim, quando são usados da forma correta (o que acontece raramente).

As pessoas costumam usar os Singletons como variáveis globais ou então para “aumentar” a performance pois acham que com somente uma instância de uma classe o programa fica mais leve. Este não é o propósito dos Singletons; usá-los desta forma é gambiarra e só reduz a testabilidade da sua aplicação sem trazer nenhum benefício.

Z

Não é necessário usar a API inteira da Java SE para poder dizer que programa em Java. Portanto, eu não acho que precise usar todas as funcionalidades de Java EE para que você se considere programando em Java EE. Pra mim, usar Servlets e JSP é Java EE sim. Assim como um código com alguns IFs, System.outs, etc continua sendo Java. Até por que se fosse necessário conhecer tudo da especificação, o GUJ teria no máximo 10 pessoas que conhecem Java EE…

Uma busca aqui no fórum e você vai entender! Tem um monte de tópico sobre isso. :wink:

pcalcado

Aliás,

Se eu tivesse que usar tudo de Java EE para usar Java EE, então teria que usar tudo de Java SE para dizer que uso Java SE.

Se eu usasse só um pedaço, como qualquer programa faz, o que raios eu estaria usando? :roll:

R

pcalcado:

Agora, antes de pensar em mais qualquer coisa remova TODOS os singletons deste sistema.

Discordo totalmente desta afirmação (diante do conhecimento que tenho rs)…pelo que sei padrões de projetos foram criados com o objetivo de trazer soluções para problemas…

Por exemplo a inicialização do objeto sessionFactory no Hibernate é um processo demorado, então preciso de uma única instância deste objeto…

Nenhum cliente deseja esperar pra cada solicitação um novo carregamento deste objeto…

Utilizando o padrão Singleton esse problema é resolvido…então pq não utilizar o Singleton nesta situação???

Caso esse padrão de projeto seja desnecessário o que utilizar nesse exemplo acima pra resolver o problema sem o Singleton???

Abraços

Rafael Oliveira

pcalcado

A afirmação é propositadamente exagerada, mas duas coisas antes de prosseguir com um Singleton:

  1. Dê um exemplo de Singleton bem utilizado numa aplicação corporativa normal (e não um framework ou algo de infra-estrutura como Hibernate)

  2. Dê um exemplo (aqui pode ser de infra-estrutura) que não possa ser resolvido por uma Factory que retorna sempre o mesmo objeto

De qualquer forma, o exemplo da isntanciação da SessionFactory é resolvido pela técnica citada em (2), que não faz qualquer exigência sobre seu objeto (e é como, por exemplo, o Spring trabalha nestes casos).

R

pcalcado:
A afirmação é propositadamente exagerada, mas duas coisas antes de prosseguir com um Singleton:

  1. Dê um exemplo de Singleton bem utilizado numa aplicação corporativa normal (e não um framework ou algo de infra-estrutura como Hibernate)

  2. Dê um exemplo (aqui pode ser de infra-estrutura) que não possa ser resolvido por uma Factory que retorna sempre o mesmo objeto

De qualquer forma, o exemplo da isntanciação da SessionFactory é resolvido pela técnica citada em (2), que não faz qualquer exigência sobre seu objeto (e é como, por exemplo, o Spring trabalha nestes casos).

Não entendi bem o que vc quis dizer…

mas…como ficaria o código do Factory e o do Singleton no caso de retornar uma única instância do objeto sessionFactory carregado??

Rafael Oliveira

pcalcado

Você quer um Singleton ou você quer uma variável global?

Para obtêr a referência para uma Factory ou você usa Registry ou IoC. Provavelmente já existe algum objeto que faz este papel, ou você pode usar JNDI, Spring, PicoContainer, IoC do Java EE 5.0…

Na pior das hipóteses você pdoe ter algo assim:

class Fabrica{
 
 private static Objeto objeto = //instancia o dito cujo;

 public static Objeto getObjeto(){return objeto;}

}

Nesse caso você tem uma variável global disfarçada (ruim) mas pelo menos não usa Singletons a toa (muito ruim).

R

pcaldado to com uma dúvida de inciante aqui....

Singleton que conheço....

class Singleton{

private static Conexao conexao = new Conexao();

private Singleton() {}

public static Conexao getConexao(){
   return conexao;
}

Factory que vc disse....

class Fabrica{
  
  private static Objeto objeto = //instancia o dito cujo;
 
  public static Objeto getObjeto(){return objeto;}
 
 }

a dúvida surgiu pq os códigos são identicos, a única diferente é que coloquei o private no contrutor dizendo que ninguem pode instanciar a classe Singleton....

daí nesses dois códigos qual a diferença entre Singleton e Factory? ou então pode ser que eu não sei qual o código de um Singleton de verdade...

Rafael Oliveira

pcalcado

Um Singleton é uma classse que só pode ter uma instância. Factory é um objeto que cria outros. A forma como você obtêm a referência para um Singleton ou uma Factory não está relacionada com o padrão, você pode obter a referência de diversas maneira, entre elas uma das piores que é uma pseudo-variável global. A variável global geralment eestá disfarçada de me´todo estático do tipo:

class MinhaClasse{
 public static MinhaClasse get Instanca(){...}
}

E pelo visto você está acostumado a usar Singletons como variáveis globais. Este é exatamente o problema que faz com que remover completamente singletons seja quase sempre uma decisão acertada.

Resumindo: o que você chama de Singleton na verdade é um disfarce para uma variável global, Singleton é outra coisa.

R

ok pcaldado....então com ficaria minha classe HibernateUtil que retorna o objeto sessionFactory sem utilizar como variável global??? utilizando o Factory ao invés do Singleton

...ou seja qual a forma mais aconselhada que meu código deve estar?

código do HibernateUtil.java

import org.hibernate.Session;
 import org.hibernate.SessionFactory;
 import org.hibernate.cfg.Configuration;
 public class HibernateUtil {
 	private static SessionFactory factory;
 	static {
 		try {
 			factory = new Configuration().configure().buildSessionFactory();
 		} catch (Exception e) {
 			e.printStackTrace();
 			factory = null;
 		}
 	}
 	
 	public static Session getSession() {
 		return factory.openSession();
 	}
 }
pcalcado

Esse seu exemplo já não é um Singleton e sim uma fábrica estática. Para melhorar: http://www.springframework.org

R

pq???

não tem um única instância???

o padrão Singleton não garante isso…ter um classe que retorne uma única instância de um objeto…?

1 - o que faz a minha Classe não ser mais singleton???

um exemplo de Factory que eu sei é quando retorno por exemplo para uma interface uma ou outra implementação definida na classe Factory…a exemplo a classe SessionFactory para retornar sessões…

ou seja no meu exemplo HibernateUtil tenho o singleton para retornar única instancia do objeto sessionFactory… e o SessionFactory na sua classe implementa o padrão Factory

2 - vc não esta confundindo os padrões? única instância não se refere ao Singleton? ou o Factory também garante isso?

pcalcado

Um Singleton é um objeto que só pode ter uma instância.
Uma Factory é um objeto que cria outros objetos.

Singleton não cria objetos.

Seu objeto é uma Factory estática, não há (1) motivo para só haver uma instância dela (desperdício de recursos é algo ruim mas não invalida o estado do seu sistema) e (2) ela sequer é instanciada, nem mesmo uma vez como seria esperado, é apenas um bando de métodos e atributos estáticos.

R
pcaldado:
Esse seu exemplo já não é um Singleton e sim uma fábrica estática.

Leia esse texto retirado do site do Hibernate

We'll create a HibernateUtil helper class which takes care of startup and makes accessing a SessionFactory convenient. Let's have a look at the implementation:
package util;

import org.hibernate.*;
import org.hibernate.cfg.*;

public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    static {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

This class does not only produce the global SessionFactory in its static initializer (called once by the JVM when the class is loaded), but also hides the fact that it uses a static singleton.


fonte: [url]http://www.hibernate.org/hib_docs/reference/en/html/tutorial.html[/url]

leia as últimas linhas....STATIC SINGLETON... me mostre algum texto de onde vc tirou essa viagem de ???Fábrica Estática??? pra o esse treho de código?? não confunda factory é outra coisa e pra outra utilidade

ahh acho q to entendendo pq vc ta se perdendo nos padrões de projeto pq minha variável de única instância é do tipo SessionFactory.....

mas isso ai num tem nada a ver....poderia ser para um tipo Conexao, ObjetoQualquer....

Abraços

Rafael Oliveira

pcalcado
  1. Leia seu próprio texto antes de falar na “viagem” dos outros:

E não “it is a static singleton”. E ainda assim o objeto em questão não é um Singleton, ele está sendo usado como um, o que é o que eu sugeri

  1. Procure no Google antes de falar na “viagem” dos outros: http://www.google.com/search?q=“static+factory”+pattern

  2. Antes de continuar leia o livro da GoF (ou qualquer bom livro sobre Desing Patterns) para entender o que é um Singleton.

R

ta bom…quer dizer que essa classe não é um exemplo do padrão Singleton???

não to dizendo que a fábrica estática não existe…sua viagem foi dizer q o HibernateUtil usa esse padrão…

obs: o texto está correto. a classe HibernateUtil usa o padrão static singleton

essa foi boa

Abraços

Rafael Oliveira

pcalcado

Vamos lá, compelte a frase:

rafoli:
não to dizendo que a fábrica estática não existe…sua viajem foi dizer HibernateUtil é ela…

Por que…?

Seu HibernateUtil é apenas uma Factory que retorna a mesma instância sempre. Se ao invés disso ela retornasse novas SessionFactory seria uma Factory normal baseada em métodos estáticos (algo muito comum). E como já vimos em posts anteriores ela não é um Singleton, e pela definição de Singleton ele não pode ser instanciado mais de uma vez (por isso normalmente seu construtor é privado), loooooogo:

  1. Seu código msotra uma Factory que retorna o mesmo objeto
  2. O objeto em questão não é um Singleton
  3. Se quiser melhorar essa variável global use IoC ou ao menos um Registry

Leia o livro sugerido. Se já leu, defina Singleton, por favor.

(Ao responder por favor use argumentos.)

R

pcaldado retiro sempre o q digo aki de texto de fontes q penso seguras...

eu sei q singleton é uma única instancia do objeto...para o exemplo abaixo uma única instancia da classe ClassicSingleton

public class ClassicSingleton {
   private static ClassicSingleton instance = null;
   protected ClassicSingleton() {
      // Exists only to defeat instantiation.
   }
   public static ClassicSingleton getInstance() {
      if(instance == null) {
         instance = new ClassicSingleton();
      }
      return instance;
   }
}

mas repare este outro código retirado no site do struts 2

/
**
 * Helper Singleton class to manage Hibernate Sessions.
  */
public class HibernateUtil {
   ...
   
   private static final SessionFactory SESSION_FACTORY;

    /** Make default construct private */
    private HibernateUtil() { }

    /** Loads Hibernate config. */
    static {
        try {
            LOG.debug("HibernateUtil.static - loading config");
            SESSION_FACTORY = new Configuration().configure().buildSessionFactory();
            LOG.debug("HibernateUtil.static - end");
        } catch (HibernateException ex) {
            throw new RuntimeException("Exception building SessionFactory: " + ex.getMessage(), ex);
        }
    }

...

}

atente ao comentário da classe...

/**
 * Helper Singleton class to manage Hibernate Sessions.
  */

traduzindo: Class Singleton auxiliar para gerenciar as sessões hibernate

kra confronto em relação a vc dizer que não é singleton pela documentação do site(struts2)dizer que é ....então agora vc questione o que este comentário quis dizer

uso este forúm para trocar conhecimento e aprender com todos vocês....o comentário fala do Singleton?...ou estou errado na interpretação?

Abraços

Rafael Oliveira

I

essa historia de singletons daqui a uns tempos vai ficar parecendo com aquele filme, “A vila”.
lembra tambem a seguinte cena:
o guri vai perguntar pro pai programador: “papai, o que é singleton?” aih o pai dá tapa na cara do muleque e diz: “nunca mais ouse pronunciar esse nome”.

hoje em dia quase todo mundo sabe que nao se pode usar singletons, mas (eu pelomenos) nao entendo exatamente o motivo.

só sei que o singleton é feio, é do mau, e se usar vai ser jogado no fogo eterno.

normalmente se acha seguinte resposta : “nao use singleton, existe outros meios”.

mas eu concordo que nao se deve utilizar em qualquer situaçao. É o classico exemplo da faca que pode ser usada pra matar outra pessoa, ou pra cortar uma carne de boi.
mas o problema nao é a faca, mas o uso que se faz dela.
eliminar todas as facas do mundo nao será a salvaçao da humanindade.

guilherme.chapiewski

immortalSoul:
hoje em dia quase todo mundo sabe que nao se pode usar singletons, mas (eu pelomenos) nao entendo exatamente o motivo.

http://www.google.com.br/search?q=singleton+antipattern

(aproximadamente 224.000 resultados para singleton antipattern)

pcalcado
rafoli:
pcaldado retiro sempre o q digo aki de texto de fontes q penso seguras...

Existem alguns problemas.
1) As fontes que você está citando não são as melhores no contexto, leia a bibliografia recomendada que traz as definições sobre o assunto

2) Dado o exemplo mais acima e o exemplo anterior, me parece que você não está fazendo uma leitura cuidadosa dos exemplo, pode ser impressão minha.

E porque não acho que fazes uma leitura cuidadosa? Porque a classe que você acaba de colar é um singleton e ela é completamente diferente da anterior.

Detalhe simples:
mas repare este outro código retirado no site do struts 2
/**
 * Helper Singleton class to manage Hibernate Sessions.
  */
public class HibernateUtil {
   ...
   
   private static final SessionFactory SESSION_FACTORY;

    /** Make default construct private */
    private HibernateUtil() { }
...

}

Viu um construtor privado ali?

Agora vamos ao outro exemplo, que você havia colado mais abaixo:

package util;
 
 import org.hibernate.*;
 import org.hibernate.cfg.*;
 
 public class HibernateUtil {
 
     private static final SessionFactory sessionFactory;
 
     static {
         try {
             // Create the SessionFactory from hibernate.cfg.xml
             sessionFactory = new Configuration().configure().buildSessionFactory();
         } catch (Throwable ex) {
             // Make sure you log the exception, as it might be swallowed
             System.err.println("Initial SessionFactory creation failed." + ex);
             throw new ExceptionInInitializerError(ex);
         }
     }
 
     public static SessionFactory getSessionFactory() {
         return sessionFactory;
     }
 
 }

Responda:

1) Quantos construtores existem no segundo exemplo? Eles são privados?

2) A primeira classe não pode ser instanciada (fora dela mesma), a segunda pode? Quantas vezes? Se pode mais de uma vez ela é um Singleton?

3) Um Singleton é um objeto que só pode ser instanciado uma vez. Eu preciso instanciar a classe do segundo exemplo apra utilizá-la? Se não preciso ela é um Singleton?

Resposta: O código do Struts em questão se baseou no segundo trecho mostrado mas o tornou um Singleton. Provavelmente seus métodos não são estáticos mas existe um método análogo ao getInstance() que deve ser.

Como já falei antes, Hibernate e Struts são código de infra-estrutura, um exemplo com códigod e lógica de aplicação se faz necessário e para não utilizar estas variáveis globais utilize uma abordagem de IoC como Spring ou Java EE 5.0.

R

pcaldado eu apresentei esse código e vc questionou

leia os tópicos anteriores e procura o que tem esse código

class Singleton{

private static Conexao conexao = new Conexao();

private Singleton() {}

public static Conexao getConexao(){

return conexao;

}</blockquote>
pcalcado
rafoli:
pcaldado eu apresentei esse código e vc questionou

leia os tópicos anteriores e procura o que tem esse código

E você lembra o que eu questionei?

Você falou:

rafoli:
Singleton que conheço....
class Singleton{

private static Conexao conexao = new Conexao();

private Singleton() {}

public static Conexao getConexao(){
   return conexao;
}

Factory que vc disse....

class Fabrica{
  
  private static Objeto objeto = //instancia o dito cujo;
 
  public static Objeto getObjeto(){return objeto;}
 
 }

a dúvida surgiu pq os códigos são identicos, a única diferente é que coloquei o private no contrutor dizendo que ninguem pode instanciar a classe Singleton....

daí nesses dois códigos qual a diferença entre Singleton e Factory? ou então pode ser que eu não sei qual o código de um Singleton de verdade...

pcalcado:
Um Singleton é uma classse que só pode ter uma instância. Factory é um objeto que cria outros. A forma como você obtêm a referência para um Singleton ou uma Factory não está relacionada com o padrão, você pode obter a referência de diversas maneira, entre elas uma das piores que é uma pseudo-variável global. A variável global geralment eestá disfarçada de me´todo estático do tipo:
class MinhaClasse{
 public static MinhaClasse get Instanca(){...}
}

E pelo visto você está acostumado a usar Singletons como variáveis globais. Este é exatamente o problema que faz com que remover completamente singletons seja quase sempre uma decisão acertada.

Resumindo: o que você chama de Singleton na verdade é um disfarce para uma variável global, Singleton é outra coisa.

O ponto foi: eu não preciso tornar essa classe um Singleton para ter uma variável global. Esta classe não precisa ser um Singleton, ela foi implementada como um apenas para você ter uma variável global.

Singleton é um padrão de projeto que tem utilidade específica em um contexto específico. Você está utilizando um construtor privado e um método estático para fazer lookup, que são mecanismos normalmente utilizados para implementar Singletons, mas tudo que quer é utilizar uma variável global. Vai ter algum problema se eu tiver duas instância sdo Singleton (além de, como já falei algumas vezes nesta thread, consumo de recursos extra)? Nçao? Então não é um Singleton, é uma variável global e pode ser substituído pelas técncias já colcoadas aqui diversas vezes.

Simplificando: Não é porque você tem construtor privado e método getInstance() estático que você tem um Singleton, você tem é uma variável global

guilherme.chapiewski

rafoli, presta atenção, na boa.

O que o Phillip tá falando não é da implementação do Singleton, mas sim do uso que você está dando para ele. Singletons não são feitos para serem utilizados como variáveis globais mas sim para casos onde não é permitido ter mais de uma intância de um objeto.

pcalcado

Como este trecho foi adicionado depois ele vai ser comentado em paralelo:

O textoe stá certo, sua interpretação que não está.

Em OO existe uma diferença enorme entre ser e usar. Confira um bom livro de orientação a objetos.

R

vlw pelas informações

abraços

Rafael Oliveira

sergiotaborda

O codigo :

import org.hibernate.Session;
 import org.hibernate.SessionFactory;
 import org.hibernate.cfg.Configuration;
 public class HibernateUtil {
 	private static SessionFactory factory;
 	static {
 		try {
 			factory = new Configuration().configure().buildSessionFactory();
 		} catch (Exception e) {
 			e.printStackTrace();
 			factory = null;
 		}
 	}
 	
 	public static Session getSession() {
 		return factory.openSession();
 	}
 }

É um (quase) exemplo de Registry. A classe HibernateUtil não é um Signleton porque não tem um método que retorna objetos do tipo HibernateUtil.
Para ser um registry, HibernateUtil deveria ser final e com construtor privado.

O método:

public static Session getSession() {
 		return factory.openSession();
 	}

é um exemplo de (static) Factory Method já que é um método (estatico) que encapsula a criação de objetos Session. O método openSession() é um Factory Method tb (este normal, não estático).

Não existe singleton nenhum neste código.
A única fábrica neste código é o objeto factory.

Existe um só objecto factory, mas isso não faz com que exista singleton nesta historia. A citação "static singleton" é errada. O correto seria dizer "static shared object" ou simplesmente "shared object". Shared Object (Objeto Partilhado)- um único objeto partilhado por todo o codigo - é o padrão que está sendo usado aqui para factory.
Normalmente a forma segura de acessar um Shared Object é através de um Registry, que é exatamente o que está sendo feito no codigo.

Veneno

pcalcado:

Agora, antes de pensar em mais qualquer coisa remova TODOS os singletons deste sistema.

O pq dessa frase, não é bom usar singletons??
vlw :smiley:

pcalcado

http://www.google.com/search?q=site%3Aguj.com.br+singletons+-"ultimas+mensagens"&btnG=Search

Criado 7 de julho de 2007
Ultima resposta 18 de jul. de 2007
Respostas 47
Participantes 14