Dúvida Switch

21 respostas
G
package FlowControl;

public class Switch{
	
	static final int x = 1;


	public static void main(String[] args){

		final int i = 5;
		final Integer in = 5;
		
					
		switch(i){

			case 1:
			break;

			case in: break;

		}		
	
	}

}

No livro da Kathy fala que pode usar no switch (expressão) qualquer coisa que avalie para int. E enums.
No case fala que qualquer constante que avalie para o mesmo tipo da expressão do switch.
Porque não é possível usar a variável in no case? Ela é declarada como constante…

[]s
Gunnar

21 Respostas

anderson.bonavides
gk-bgh:
package FlowControl;

public class Switch{
	
	static final int x = 1;


	public static void main(String[] args){

		final int i = 5;
		final Integer in = 5;
		
					
		switch(i){

			case 1:
			break;

			case in: break;

		}		
	
	}

}

No livro da Kathy fala que pode usar no switch (expressão) qualquer coisa que avalie para int. E enums.
No case fala que qualquer constante que avalie para o mesmo tipo da expressão do switch.
Porque não é possível usar a variável in no case? Ela é declarada como constante..

[]s
Gunnar

Resposta:
Por que só é possível e só são aceitas variáveis do tipo int, char, Long e Enun´s. Também não é possivel variáveis que mudem de valores no meio do código. Por isso a exigência por variáveis constantes.

ViniGodoy

A conversão de Integer para int não é feita através de cast.

As conversões são dessa forma:

int i = umInteger.intValue(); Integer umInt = Integer.valueOf(i);

A partir do Java 5, isso só ficou implícito, mas o mecanismo continua o mesmo.

G
anderson.bonavides:
gk-bgh:
package FlowControl;

public class Switch{
	
	static final int x = 1;


	public static void main(String[] args){

		final int i = 5;
		final Integer in = 5;
		
					
		switch(i){

			case 1:
			break;

			case in: break;

		}		
	
	}

}

No livro da Kathy fala que pode usar no switch (expressão) qualquer coisa que avalie para int. E enums.
No case fala que qualquer constante que avalie para o mesmo tipo da expressão do switch.
Porque não é possível usar a variável in no case? Ela é declarada como constante..

[]s
Gunnar

Resposta:
Por que só é possível e só são aceitas variáveis do tipo int, char, Long e Enun´s. Também não é possivel variáveis que mudem de valores no meio do código. Por isso a exigência por variáveis constantes.

Só são aceitas variáveis do tipo char, byte, short e int e enum.
long não compila quando usado no switch. Dá erro de compilação: possible loss of precision.No caso a variável que eu declarei in funciona para ser usado assim switch(in). Mas não funciona case in:

Olhando um outro livro achei que final torna o valor de um primitivo em uma constante e a refêrencia em uma referência constante (que não pode ser modificada)....mas não em uma constante própriamente dita. Deve ser por isso que não é possível usar a variável in no case.

[]s
Gunnar

G

ViniGodoy:
A conversão de Integer para int não é feita através de cast.

As conversões são dessa forma:

int i = umInteger.asInteger(); Integer umInt = Integer.valueOf(i);

A partir do Java 5, isso só ficou implícito, mas o mecanismo continua o mesmo.

não existe o método Integer.asInteger() no Java 5.

[]s
Gunnar

ViniGodoy

Ops… o nome do método é intValue(). Falha nossa. Já tá corrigido lá em cima! :slight_smile:

anderson.bonavides
gk-bgh:
anderson.bonavides:
gk-bgh:
package FlowControl;

public class Switch{
	
	static final int x = 1;


	public static void main(String[] args){

		final int i = 5;
		final Integer in = 5;
		
					
		switch(i){

			case 1:
			break;

			case in: break;

		}		
	
	}

}

No livro da Kathy fala que pode usar no switch (expressão) qualquer coisa que avalie para int. E enums.
No case fala que qualquer constante que avalie para o mesmo tipo da expressão do switch.
Porque não é possível usar a variável in no case? Ela é declarada como constante..

[]s
Gunnar

Resposta:
Por que só é possível e só são aceitas variáveis do tipo int, char, Long e Enun´s. Também não é possivel variáveis que mudem de valores no meio do código. Por isso a exigência por variáveis constantes.

Só são aceitas variáveis do tipo char, byte, short e int e enum.
long não compila quando usado no switch. Dá erro de compilação: possible loss of precision.No caso a variável que eu declarei in funciona para ser usado assim switch(in). Mas não funciona case in:

Olhando um outro livro achei que final torna o valor de um primitivo em uma constante e a refêrencia em uma referência constante (que não pode ser modificada)....mas não em uma constante própriamente dita. Deve ser por isso que não é possível usar a variável in no case.

[]s
Gunnar

Realmente troquei um short por um long. Mas é totalmente possível usar o modificador final em um case.
EX:

publiv static void main(String[] a){
  float i= 0;
  final byte j=5;
  final short s =4;
  while(i<5){
         switch((int) i+ 2){
                default:
                case j: System.out.println("um");
                      break;
               case s+1:  [b]<== ERRO[/b]
               {
                    System.out.println("two");
                     break;
                }
         }i++     //fim do switch
  } 

}

valor de s é igual a 4 + 1=5, valor de j também é 5. Nenhum problema com o modificador final.

G
anderson.bonavides:
gk-bgh:
anderson.bonavides:
gk-bgh:
package FlowControl;

public class Switch{
	
	static final int x = 1;


	public static void main(String[] args){

		final int i = 5;
		final Integer in = 5;
		
					
		switch(i){

			case 1:
			break;

			case in: break;

		}		
	
	}

}

No livro da Kathy fala que pode usar no switch (expressão) qualquer coisa que avalie para int. E enums.
No case fala que qualquer constante que avalie para o mesmo tipo da expressão do switch.
Porque não é possível usar a variável in no case? Ela é declarada como constante..

[]s
Gunnar

Resposta:
Por que só é possível e só são aceitas variáveis do tipo int, char, Long e Enun´s. Também não é possivel variáveis que mudem de valores no meio do código. Por isso a exigência por variáveis constantes.

Só são aceitas variáveis do tipo char, byte, short e int e enum.
long não compila quando usado no switch. Dá erro de compilação: possible loss of precision.No caso a variável que eu declarei in funciona para ser usado assim switch(in). Mas não funciona case in:

Olhando um outro livro achei que final torna o valor de um primitivo em uma constante e a refêrencia em uma referência constante (que não pode ser modificada)....mas não em uma constante própriamente dita. Deve ser por isso que não é possível usar a variável in no case.

[]s
Gunnar

Realmente troquei um short por um long. Mas é totalmente possível usar o modificador final em um case.
EX:

publiv static void main(String[] a){
  float i= 0;
  final byte j=5;
  final short s =4;
  while(i<5){
         switch((int) i+ 2){
                default:
                case j: System.out.println("um");
                      break;
               case s+1:  [b]<== ERRO[/b]
               {
                    System.out.println("two");
                     break;
                }
         }i++     //fim do switch
  } 

}

valor de s é igual a 4 + 1=5, valor de j também é 5. Nenhum problema com o modificador final.

Eu não quis dizer que o problema era com o final. Não tem problema algum com o final. O que eu falei é do conceito da aplicação do final.
final int x = 5; gera um compile-time constant
final Object f = new Object(); gera um constant reference.... que é diferente de um compile-time constant.

E o case requer um compile-time constant. Isso que eu quis dizer...

[]s
Gunnar

anderson.bonavides

Sim agora ficou claro e olhando sua explicação mais acima percebi oq vc tava falando. Só não tinha entendido. Mas de qualquer forma gerou uma discurção bacana e foi bastante construtiva para mim. Axo que para todos que lerem também.

=]

G

anderson.bonavides:
Sim agora ficou claro e olhando sua explicação mais acima percebi oq vc tava falando. Só não tinha entendido. Mas de qualquer forma gerou uma discurção bacana e foi bastante construtiva para mim. Axo que para todos que lerem também.

=]

Isso ai :slight_smile:

Vamos que vamos pra certificação :slight_smile:

[]s
Gunnar

LPJava

o autoboxing funciona ali no:

case in:

por isso que nao compila :smiley:

Raff

Pessoal me surgiu uma dúvida besta…

final int i = 2;//isso é constantes ??
static final int u = 4 ; // isso é constantes ??

To com dúvida em saber o que é constantes :oops: Me embananei todo… :oops:

G

LPJava:
o autoboxing funciona ali no:

case in:

por isso que nao compila :D

não entendi o que você falou…

[]s
Gunnar

G

Raff:
Pessoal me surgiu uma dúvida besta…

final int i = 2;//isso é constantes ??
static final int u = 4 ; // isso é constantes ??

To com dúvida em saber o que é constantes :oops: Me embananei todo… :oops:

Sim…
final int i = 2 ; //compile-time constant
static final int u = 4; //compile-time constant

final Integer i = 2; //constant reference
static final Integer u = 4; //constant reference

[]s
Gunnar

LPJava

ae raff nao confuda a modificador static com valor constante… em java é diferente… eu tb passei por isso qdo começei a estudar, e achava que static tinha ver com valor que nao muda… mais em java é o final… que diz esse é o valor final de minha variavel. heheheheh… foi uma forma q usei na epoca… de identificar e aprender…

static - aqui quando vc declara ele tanto no metodo quanto na variavel vc esta diznedo que pode acessar o membro sem precisar da new. Ele pertence a class
final e aqui nao diz nada… referente a acesso… diz apenas que o valor da variavel nao pode mudar e no caso de metodos nao podem ser subscrito e no caso de uma classe nao pode ter filhos. Ex: String, Integer, Double - sao classes com o modificador final.

eu falei que a questao de Integer ser uma class final… ela nao é permitida no case, pq o autoboxing do java 5 funciona normalmente ali… entao se vc tem:

Integer n=10;
switch(n){
case n:
}

se isso funcionasse quebraria a regra dizendo que no case tem q ser constante/literal.
Ja que se vc fizer isso:

n+=10;

O n do case vai ser alterado… pelo recurso do autoboxing.

So que falei de forma resumida. E String tb nao é permitido no case:
[code:
case “camilo”:
[/code]
ja vi uma duvida assim:

StringBuilder sb = new StringBuilder("camilo");
switch(sb){
case "camilo" :
}

flw!! espero ter ajudado!

Raff

Então quando eu usar final já é uma constante não é preciso fazer static final ??

G

O modificador static é usado quando você quer que o atributo faça parte da CLASSE e não do OBJETO. Geralmente se coloca static nas constantes porque elas não vão variar de objeto para objeto (por isso o nome de constante :wink: ). Já que essas variáveis não vão mudar em cada instância do objeto o ideal então é declarar dentro da classe. Mas se você declarar dentro do objeto ie

private final int CONSTANTE = 6;

continua sendo uma constante…

[]s
Gunnar

LPJava

sim… final ja eh uma constante… e como gk-bgh falou… tb… pense no static como nivel de acesso. Um exemplo

static - veja como:

A geladeira da casa de XXX, que todo mundo abre, ver o que tem la… mesmo quem nao é daquela casa… acessa e ver a o conteudo da geladeira.

agora quando nao tem o static
Aqui é mais restrito… so quem é daquela mesma familia(classe) pode abrir a geladeira.

uaua deu para entender com o exemplo maluco ai?

flw!

Raff

falow pessola entendi :smiley: exemplo do camilo super bom hauhauh

Raff

eu tenho um vizinho assim (brincadeira hauhauha)

G

exemplo pra você entender o static

public class Static{
   public static int x = 0;
   public static void main(String[] args){
          Static s = new Static();
          Static s1 = new Static();
          
          System.out.println(s.x);
          System.out.println(s1.x);

          s.x = 5;

          System.out.println(s.x);
          System.out.println(s1.x);  

   }
}

Tira o static da variável x e compila denovo que você vai entender a diferença…

[]s
Gunnar

Raff

valew pessoal eu entendi valew

Criado 20 de novembro de 2007
Ultima resposta 21 de nov. de 2007
Respostas 21
Participantes 5