Enhanced for

10 respostas
C
public class Casa
{
   Porta[] portas = new Porta[10];
   int totalDePortas = 0;

   void adicionaPorta()
   {
	portas[this.totalDePortas++] = new Porta();
   }
   
   int metodoBla
   {
      for(int i : this.portas)
      {
         System.out.println("Olá");
      }
   }
}

Tá dando erro nesse this.portas...
Onde to errando?

10 Respostas

E

Java != Javascript (onde o foreach fornece um índice, não um valor).

O correto é:

for(Porta p : this.portas)  
       {  
          System.out.println("Olá");  
       }
marcelo.bellissimo

Voce tá usando alguma IDE pra programar? Se não, recomendo usar...

Algumas correções:
public class Casa
{
   Porta[] portas = new Porta[10];
   int totalDePortas = 0;

   void adicionaPorta()
   {
	portas[this.totalDePortas++] = new Porta();
   }

   // seu metodo retorna um int? nao... mudei pra void
   // e como eh um metodo, deve ter parenteses ()
   void metodoBla()
   {
	  // this.portas nao eh um array de int, o correto seria isso:
	  // (para cada Porta 'i' no array de Porta this.portas)
      for(Porta i : this.portas)
      {
         System.out.println("Olá");
      }
   }
}
C

No caso o for percorrerá todo o array ou somente as posições inicializadas?

E

Todo o array - ele não checa se uma posição é inicializada ou não.

C

Eu tenho que saber quantos índices eu quero antes de inicializá-los?

marcelo.bellissimo
Todas... veja um teste:
public class Casa {
	Porta[] portas = new Porta[10];
	int totalDePortas = 0;

	public Casa(){
		metodoBla();
	}

	void adicionaPorta() {
		portas[this.totalDePortas++] = new Porta();
	}

	void metodoBla() {
		portas[0] = new Porta();
		portas[3] = new Porta();
		portas[6] = new Porta();
		for (Porta i : this.portas) {
			System.out.println(i);
		}
	}

	public static void main(String[] args) {
		new Casa();
	}
}
O resultado:
tests.Porta@42e816
null
null
tests.Porta@9304b1
null
null
tests.Porta@190d11
null
null
null
C

Mas tipo…

Eu tenho q reservar essas 10 portas antes de saber de quantas portas eu vou precisar?
Não tem como ir reservando à medida q for sendo preciso inicializá-las?

marcelo.bellissimo

No caso do array, sim… por isso se usa listas, interface List, é bem mais prático que arrays…

cake:
Eu tenho q reservar essas 10 portas antes de saber de quantas portas eu vou precisar?
Não tem como ir reservando à medida q for sendo preciso inicializá-las?

Infelizmente arrays não te dão a opção de alocação dinâmica… ele começa e termina com um tamanho fixo… use listas, elas são a sua salvação!

// crie a lista List<Porta> portas = new ArrayList<Porta>(); // adicione novos objetos Porta, dessa maneira: portas.add(new Porta()); //ou dessa: Porta porta = new Porta(); portas.add(porta);

C

Tem como me explicar exatamente como funciona esse enhanced for?
Digo… passo a passo se não for pedir muito… ^^’

marcelo.bellissimo
cake:
Tem como me explicar exatamente como funciona esse enhanced for? Digo... passo a passo se não for pedir muito.. ^^'

Basta entender a maneira de se "ler" esse tipo de 'for'... a sintaxe é essa:

// dada uma Collection<Object> c

List<Object> c = new ArrayList<Object>();
for (Object o : c){
    // faz algo
}

O que temos ai em cima, se lê assim:
"Para cada Object, na Collection(lista) de Object's c, crie uma variavel chamada o"

Seria praticamente a mesma coisa se você fizesse isso:
// dada uma Collection<Object> c

List<Object> c = new ArrayList<Object>();
for (int i = 0; i < c.size(); i++){
    Object o = (Object)c.get(i);
    // faz algo
}

Fica feio né?

Criado 30 de agosto de 2010
Ultima resposta 30 de ago. de 2010
Respostas 10
Participantes 3