Classes Genéricas

Estou tentando colocar a seguinte classe genérica para funcionar:

public Object executaNamedQuerySingleResult(String namedquery) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("System"); EntityManager em = emf.createEntityManager(); Object result = null; try { result = em.createNamedQuery(namedquery) .getSingleResult(); } catch (Exception e) { e.printStackTrace(); em.getTransaction().rollback(); } finally { em.close(); } return (result); }
Na teoria ela retorna um Objeto para mim, então eu passaria um Cast e teria o objeto na mão.
Então eu a chamo assim:

public boolean ValidaVersao() { String versaoBd = (String) dao.executaNamedQuerySingleResult("PfUtils.findVersion").toString(); if (versaoBd == versaoatual) { return true; } else { return false; } }
Porem quando vou Debugar as variáveis versaoBd e versaoatual são strings com valor 0.1 (vide imagem em anexo), mas o sistema insiste em retornar FALSE.
Mas se eu uso a classe “não genérica” ele funciona.

private String VersaoServidor() { EntityManagerFactory emf = Persistence.createEntityManagerFactory("System"); EntityManager em = emf.createEntityManager(); Object result = null; try { result = em.createNamedQuery("PfUtils.findVersion") .getSingleResult(); } catch (Exception e) { e.printStackTrace(); em.getTransaction().rollback(); } finally { em.close(); } return (result.toString()); }

Alguém consegue ver onde eu estou errando?

Creio que se você substituir o código…

if (versaoBd == versaoatual) {  
        return true;  
    } else {  
        return false;  
    }  

por

if (versaoBd.equals(versaoatual)) {  
        return true;  
    } else {  
        return false;  
    }  

Vai funcionar.

Só para conceito também, você não está usando classes genéricas “Generics java”.

Perfeito Rock!

Quanto ao “Classe Genérica” eu queria dizer que, é uma classe que eu só informo a NamedQuery que quero e independente de onde ela tiver ele chama pra mim, para eu não ter esse método em cada classe de controle, Coloco essa em uma “classe genérica” e coloca as demais para herdar.

Posso estar errado, é algo que pensei hoje de manha e estou tentando implementar.

att.

ps.: Hoje aprendemos que para comprar Strings é bom usar Equals… iaushdiaoshdouiashd

Na verdade comparar objetos deve-se SEMPRE usar equals, o fato de funcionar as vezes era uma mera coincidência, quando vc usa o == para comparar, está na verdade comparando o valor de referência ou valor de alocação da memória daquele objeto… A JVM usa o pool de String Java para otimiza o espaço utilizado em memória, por isso, pode ser que em duas instâncias de objeto String com o mesmo valor, o operador == retorne true, pois serão alocados na mesma referência heap. Mas isso não é garantido. O que quero dizer é:

String s1 = "teste";
String s2= "teste";
s1.equals(s2) //retorna true
s1 == s2 //não é certo o que irá retornar

[quote=rockcentauro]Creio que se você substituir o código…

if (versaoBd == versaoatual) {  
        return true;  
    } else {  
        return false;  
    }  

por

if (versaoBd.equals(versaoatual)) {  
        return true;  
    } else {  
        return false;  
    }  

Vai funcionar.

Só para conceito também, você não está usando classes genéricas “Generics java”.
[/quote]

Melhor ainda seria substituir todo esse código por: