Goto xxx

Ola amigos

Gostaria de saber como implementar o comando GOTO do C++ no Java .
Exemplo: Dado uma certa condição de um if , eu qeuro q a execução vá para outro ponto do código marcado com um rótulo …
no C++ seria

if (a>b) goto ponto;

ponto: return;

Obrigado

pesquise sobre break label – é a unica forma de fazer isso :wink:

goto não foi implemetada na linguagem Java. É considerada perigosa.
A palavra goto é reservada em java, mas não é utilizada.

Se vc tentar usar goto em java, o compilador lhe adivertirá:

‘goto’ not supported.

CRUZES!!

Ainda bem. Não devia ter sido implementada em linguagem alguma.

Uma vez eu ouvi que ela é utilizada internamente pelo compilador. É verdade?

Alguem me explica pq é tão ruim(ou perigoso) usar goto?
Realmente acho que o código fica sujo, mas nao vejo nada de perigoso nisso.

goto?!?!?!?! Sai foooraaaaa!!1

Isso ai é o maior absurdo! Mesmo em C/C++ definitivamente não é aconselhável utilizar goto!
O problema com isso é: Seu código vira uma zona, parecendo um espaguete. O normal é que o código siga uma sequência "linear"de execução, não fique indo e voltando. O problema maior que isso gera é na hora de debugar o código, fica impraticável, você nunca sabe onde está, se perde, enfim, é terrível.
O uso de goto está entre as piores práticas de programação! Eu nunca vi um caso em que um goto fosse 100% necessário, sempre dá pra evitar usar isso, é só rever a lógica :slight_smile:

Falou!

E como fica a pilha de execução do programa? Ele não tem como saber que você saiu do método/função para limpar tudo que foi alocado…

Acho que seu trocar todos os “returns” por “gotos” uma hora vou estourar a pilha…

[quote=andre_a_s]Alguem me explica pq é tão ruim(ou perigoso) usar goto?
Realmente acho que o código fica sujo, mas nao vejo nada de perigoso nisso.[/quote]

IMHO isso eh paranoia de professor que ensina Pascal na faculdade. Os caras bitolam tanto a cabeca dos alunos, que o cara sai de la achando que “goto” eh coisa do outro mundo.

Realmente, nao eh recomendavel utilizar, mas tem la suas “classicas” aplicacoes (o velho exemplo do tratamento de erros, sair de diversos loops aninhados, etc). E sim, realmente, nao tem nada que nao de pra fazer sem o goto.

Marcio Kuchma

Se você fizer uma máquina de estados com “while” e “switch” é muito parecido com o goto. Por exemplo:

int estado = 1;
while (estado != 0) {
    switch (estado) {
    case 1:
         if (algumacoisa) estado = 2;
         else if (outracoisa) estado = 3;
         break;
    case 2:
         if (algumacoisa) estado = 3;
         else if (outracoisa) estado = 0;
         break;
     case 3:
         ... etc....
     default:
         break;
     }
}

[quote=cesarse]

Uma vez eu ouvi que ela é utilizada internamente pelo compilador. É verdade?[/quote]

Acho que não faz sentido. Porém, em java bytecode existe sim a instrução goto que é utilizado para implementar if, while, for, finally, etc nas classes compiladas.

[]s,
Sami

Ha, no livro da Kathy Sierra para certificação, quando citam sobre palavras reservadas não utilizadas, diz que o primeiro esboço que o projetista criou para o aviso de advertencia do uso do goto foi assim:

Esses projetistas tem um humor… :slight_smile:

Isso me lembrou de um tio que programava em Turbo Basic num PC-XT, ele estava desenvolvendo um editor de textos. A listagem dele era gigantesca e os “gotos” estavam lá “ajudando” a trocar as páginas de 34 para 56 depois para 25 e volta pra 56 vai pra 144.

Hauahuahauahua…

Primeiro,
se goto fosse tão terrível assim, nunca seria implementado em nenhuma linguagem.
Em java não foi implementado, isso pelo fato de java ter sido projetado para “usuários”
de um alto nível que chega a cegar!
Já usei goto e foi muito necessário. Eu poderia ter usado outros recursos,
mas com o goto ficou bem mais simples.
O cara só tem que ter cuidade e não viciar!!!

De uma olhada no texto:

Go To Statement Considered Harmful
Edsger W. Dijkstra

http://david.tribble.com/text/goto.html

Eu discordo, mangad2.

Inicialmente ele foi implementado pois era uma escolha lógica, era um comando que remetia diretamente a instrução jump, do assembly. E era com o jump que os engenheiros da época estavam acostumados. Isso não significa que a escolha tenha sido acertada, quer dizer, só po rque alguém já fez um dia, devemos continuar fazendo hoje.

Aliás, se você ler um livro de C++ (ou de qualquer linguagem de legado), vai ver uma série de recomendações do que não se deve fazer. E usar goto é uma delas. Pegue por exemplo o livro “A linguagem de programação C++”, do Bjarne Stroustroup, criador do C++, na página 132 da 3a edição traduzida. Lá ele explica o comando goto com a seguinte ressalva: “Um dos poucos usos do goto que fazem sentido em código comum é sair de um laço aninhado ou de um comando switch (um break sai fora somente do laço ou comando switch mais interno que o inclua)”. Note que é exatamente a situação que o break condicional do java implementa.

O goto não é a única coisa que as linguagens modernas tem evitado. A definição de constantes no lugar de macros, a redução de escopo de variáveis, uso de herança múltipla, e o uso cada vez mais incomum de linguagens com suporte de aritmética de ponteiros é um sinal de que a coisa tem evoluído.

É lógico que se você for um bom programador, disciplinado, você vai fazer um bom uso do goto ou de qualquer uma das coisas que falei acima. Entretanto, um dos pontos fortes do java é o fato de você não precisar ser um programador assim para programar bem. Já leu um manual de C++ ou um livro como Effective C++?

Programar C++ é como andar num campo minado. No menor descuido, você pode fazer uma besteira, inserir um erro maquiavélico ou deixar o seu código muito difícil de se manter. Tanto que bibliotecas inteiras, como a Boost, foram inventadas para driblar os erros comuns dos programadores, livros foram escritos para ensinar o que é bom e o que não é bom se fazer no código.

Acho que o Java foi uma evolução natural desse processo. Quando os programadores criaram o Java, retiraram tudo de potencialmente perigoso que tinha no C++. Viram que não adiantava manter um comando como goto para uma ou duas situações específicas. Pesaram o que causava mais mal do que bem e retiraram fora. E fizeram uma linguagem que é realmente um prazer de se programar.

Exato…
goto não é pra todo mundo.
Na verdade eu só usei uma única vez, e fiz várias alterações no código, mas ele continua lá.
Não se pode comparar C++ com JAVA, são para propósitos diferentes.
Java não faz tudo que C++ faz, mas C++ faz tudo que JAVA faz, isso é nítido porque java foi feito inicialmente em c++.
Agora, meu código não ficou horrível utilizando um goto, talvez até ficaria se eu utilizasse uns 10, mas não é o caso.
Realmente o goto foi feito para simular o jump. E como o java tá tão longe da máquina física, não tem cabimento mesmo utilizar goto.

Outra coisa também, temos que formar opniões por experiências e não por que está escrito numa certa página de um certo capítulo de um livro.

Eu programo em C++ há pelo menos 10 anos. Também já programei em Basic e tive diversos problemas com Goto.

E achei que citar o criador da linguagem é uma BOA referência para provar que, mesmo que o comando esteja numa linguagem, ele não necessariamente deve ser usado. Esse argumento era uma das suas justificativas do porque o comando goto era bom. Afinal, era o comentário de nada menos que o criador da linguagem, que manteve o comando por lá.

Por fim, seu último argumento foi um tanto infantil. A experiência não vem necessariamente de você tentar, se ferrar e descobrir que é ruim. Ler livros e aprender com outras pessoas que já tiveram seus problemas é uma ótima maneira de aprender. Até por isso livros como Design Patterns existem e se tornaram muito famosos.

Talvez 10 anos seja pouco…

O que dizer de um comentário como esse? Já tá virando Trolling.

Enfim, para não dizer que o Goto é completamente inútil, algumas situações onde ele é usado:

  1. Otimizações: Estamos falando aqui de código extremamente otimizado, onde abre-se mão da legibilidade e paga-se um preço alto de manutenção em prol de performance. Um exemplo clássico (que inclusive gerou uma dicussão similar a essa envolvendo o goto) é o caso do Kernel do Unix;

  2. Código gerado automaticamente: Código gerado por ferramentas como ANTLR podem usar goto. Acredita-se que um programador não deva meter a mão num código desses, gerado automaticamente. Notem que o código da ferramenta em si não deve usar goto, só o que ela gera. Esse código não passa da uma reescrita de instruções nativas em uma linguagem mais estruturada;

  3. Para sair de switchs e for aninhados: É o caso do break condicional do java, que nada mais é que um goto comportado. Realmente, aqui não tem escapatória. Mas há boas maneiras de escapar elegantemente dessas situações.