Instanceof X try/catch

14 respostas
R

Olá,

estamos com uma richa, digo, dúvida aqui na empresa:

-Alguns colegas insistem em dizer que, para fazer um cast eles preferem usar o instanceof e se certificarem de qual objeto estão trabalhando.

-Outros colegas insistem em dizer que, para fazer um cast eles preferem tratar um cast com try e, se der problema, tratam com um catch de ClassCastException…

Eu particularmente sou do primeiro grupo, ou seja, utilizar o instanceof.

O que vcs me dizem?

Att, Rodrigo.

14 Respostas

T

Usar instanceof é muito mais rápido que try/catch.
Você pode confirmar isso escrevendo um pequeno “benchmark”.
Só que por que é que, para começar, deveria estar vindo algo com o tipo errado? Alguma coisa não está bem nesse programa.

_fs

Hum, vejo um problema:

ok:

Object obj = // parametro;
if( obj instanceof Pessoa ) {
    Pessoa p = ( Pessoa ) obj;

    // classcastexception
    OutroObjeto no = ( OutroObjeto ) p.getObjeto();
}
else {
    executaOutraRegraDeNegocio();
}

problema:

Object obj = // parametro;
try {
    Pessoa p = ( Pessoa ) obj;
    // classcastexception
    OutroObjeto no = ( OutroObjeto ) p.getObjeto();
}
catch( ClassCastException e ) {
    executaOutraRegraDeNegocio();
}

Teria que ser resolvido assim:

Object obj = // parametro;
Pessoa p = null;
try {
    p = ( Pessoa ) obj;
}
catch( ClassCastException e ) {
    executaOutraRegraDeNegocio();
}

if( p != null ) {
    // classcastexception
    OutroObjeto no = ( OutroObjeto ) p.getObjeto();
}

Feião.

R

Obrigado pelas respostas…

Se me permitirem, irei expor a idéia de vcs para nossa equipe.

Grato,

Rodrigo.

cv1

Pessoas que capturam as seguintes exceptions devem ter sua genitalia picotada usando faquinhas de bolo pullman e expostas em praca publica:

  • ConcurrentModificationException
  • IllegalArgumentException
  • ClassCastException
  • NullPointerException
  • Throwable
  • Error

Obrigado.

ASOBrasil

cv:
Pessoas que capturam as seguintes exceptions devem ter sua genitalia picotada usando faquinhas de bolo pullman e expostas em praca publica:

  • ConcurrentModificationException
  • IllegalArgumentException
  • ClassCastException
  • NullPointerException
  • Throwable
  • Error

Obrigado.

Quanta maldade ! Só pq o cara está cagando no chão e cobrindo com jornal ? :stuck_out_tongue:

ASOBrasil

R

:shock:

A parte da merda eu não vou falar… :wink:

Vlw, Rodrigo

T

Pode ser que ele esteja praticando “programação defensiva” - defendendo-se de outras partes do sistema (ou seja, de outros noobs que trabalham com ele) que mandam objetos da classe errada.

É por isso que ele está tendo de usar um “instanceof”, ou pior, pegar um ClassCastException.

Talvez tenha sido por isso que foi inventado o “generics”, mas como de costume, sempre há um jeito de conseguir bagunçar um esquema que prometia ser perfeito.

louds

Melhor deixar o sistema explodir do que ficar criando remendos para programadores incompetentes. Se o sistema estiver bem feito ele vai naturalmente cuidar da forma correta desse tipo de erro.

renatosilva

Poxa, o colega nem falou de sistema algum, acho que é só uma ‘rixa’ mesmo…

Uma boa razão para usar instanceof seria o que o Thingol disse da velocidade…

pcalcado

renato3110:
Poxa, o colega nem falou de sistema algum, acho que é só uma ‘rixa’ mesmo…

Uma boa razão para usar instanceof seria o que o Thingol disse da velocidade…

Uma rixa que nemd everia existir.

Sobre a velocidade, o mais rápido seria não ter ClassCastExceptions a menos que seja um bug, e isso se consegue programando corretamente :wink:

R

Ok, até concordo contigo, mas e nesse caso:

http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/tree/DefaultTreeCellRenderer.html
no método:

getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus)

é passado um Object (value) do qual eu não sei que tipo é, ou melhor, é um Object. Mas na realidade ele retorna um nodo da JTree (que no nosso caso é um objeto criado por nós).

Para mim usar estes métodos eu vou ter que fazer um cast. Mas preciso saber qual objeto é… Pois podemos ter qualquer tipo de objeto lá, qualquer um que implemente TreeNode…

…deu pra entender o exemplo??

Aí é que entrou a nossa discussão…

Rodrigo

C

Se o seu objeto deve implementar TreeNode, porque passar um Object? Passa um TreeNode!

pcalcado

Exemplo de API que aidna não passou pra Generics mas mesmo assim eu suponho que você sabe que tipo de objetos adicionou no componente, não sabe? Pelo menos uma superclasse em comum ou interface.

R

Sim eu sei… heheh

é uma interface (programe para interfaces!!!) que nós criamos…

Mas mesmo assim, o cara pode querer usar a JTree com outros objetos, em outro sistema… sei lá…

Assim tu me deixa sem saída…

hehe

Rodrigo

Criado 6 de abril de 2006
Ultima resposta 7 de abr. de 2006
Respostas 14
Participantes 9