Capturando objetos e convertendo em String

6 respostas
java_child

Bom dia pessoal!

Minha dúvida é a seguinte: Quando eu armazenar Strings num Vector, por exemplo, posso recuperá-las tanto através de String.valueOf(lista.elementAt(i)) quanto blista.elementAt(i)[/b]. Gostaria de saber qual a diferença entre fazer de uma ou outra maneira, e qual a mais recomendada nessa situação…

Obrigada! :slight_smile:

6 Respostas

ricardolecheta

Olá,

os dois podem dar problemas:

se vc fizer String.valueOf(null) vai lançar NPE.

e se vc fizer um cast para string (String)lista.elementAt(i) pode ser que de ClassCastException, se for outro tipo.

já o String.valueOf aceita inclusive Object como argumento, e o toString() deste objeto será chamado para converter para String…

no seu caso como vc sabe que os elementos do Vector são Strings, e se não forem nulos vai dar na mesma (se nao tiver String nula)

felixcomputer

Bom, eu acho (apenas acho) que a melhor maneira é a primeira, pq na primeira vc usa um método da class String que converte o lista.elementAt(i) para String, que poderia ser qualquer outra coisa, int, long, e na segunda vc está forçando um casting com o (String). Como vc disse, dá no msm, mas na minha opinião, eu preferiria o primeiro,

J

Só uma correção, na realidade não lança NullPointerException, retorna “null”.

Veja a implementação do metodo na classe String:

public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }

E nesse caso não faz diferença alguma, o problema é só se você inserir um objeto que não seja String no Vector, aí vai lançar ClassCastException na segunda opção.

Recomendo de use Generics e elimine as duas:

Vector<String> lista = new Vector<String>(); //... String str = lista.elementAt(i);

rodrigoallemand

Não há diferença na programação… a diferença está na criação de objetos…
String é imutavel (não se altera) e utiliza um pool especifico na JVM.
Quando vc cria via String.valueOf(XXX), vc tentará criar uma outra String que provavelmente já está disponivel no pool. Já pelo Cast, a JVM fará apenas uma checagem se o objeto retornado pode ser castiado para String… Lembrando que o segundo caso pode levantar uma CCE caso o atributo esteja nulo ou não seja do tipo String.

ricardolecheta

Verdade eu confundi com

System.out.println(String.valueOf(null)); que chama o valueOf(char[]) e lança NPE.

java_child

Entendi… então creio que seja melhor fazer o cast nesse caso, pois eu tenho certeza absoluta que o Vector só possui elementos String… E achei muito interessante esse Generics, vou tentar utilizá-lo…

Em questão de memória e desempenho, o Generics apresenta alguma desvantagem em relação um Vector de Object?

Criado 19 de janeiro de 2007
Ultima resposta 19 de jan. de 2007
Respostas 6
Participantes 5