Problemas ao instanciar (eu acho)

4 respostas
H

Olá!
Não sei se esta é uma dúvida básica ou avançada, mas lá vai…

Fiz uma classe com os seguintes atributos e construtor:

Disciplina préRequisitos[];
Disciplina pósRequisitos[];
String nome;
static BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
private static int tamPre;
private static int tamPos;

Disciplina(String n, int tpre, int tpos) {
	nome = n;
	tamPre = tpre;
	tamPos = tpos;
	if (tpre > 0) //no decorrer da classe isso faz sentido
		préRequisitos = new Disciplina[tpre];
	if (tpos > 0)//no decorrer da classe isso faz sentido       
                    pósRequisitos = new Disciplina[tpos];
}

E com o seguinte método, que é onde está havendo problemas:

private void definirRequisitos (boolean op) {
	String n = "";
	int tpe;
	int tpo;
	try {
		if (op)  {
			for (int ind=0; ind<tamPre; ind++) {
				System.out.println("Atributo 1 "+(ind+1)");							n = entrada.readLine();
				if (n.equals("*")) {
					tamPre = ind+1;
					break;
				}
				System.out.println("sub-atributo1 de "+n+": ");
				tpe = Integer.parseInt(entrada.readLine());
				System.out.println("sub-atributo2 de "+n+": ");
				tpo = Integer.parseInt(entrada.readLine());
				préRequisitos[ind] = new Disciplina(n, tpe, tpo);					
			}
		}
		else {
		//o mesmo é feito, só que com pósRequisitos[]			
		}
	}
	catch (Exception e) {
		System.out.println("Erro ao ler do teclado!");
	}
}

Aí, o que acontece? Os valores iniciais de tamPre/tamPos, da classe instanciada no aplicativo, que são usados por outro método da própria classe, esses atributos assumes os valores tpe/tpo (é exatamente isso que acontece, eu já verifiquei dando um System.out.println sobre esses atributos).

É isso. Alguém saberia me indicar uma solução para esse problema, sem que eu precisasse alterar toda a idéia implícita.

Desde já agradeço!

4 Respostas

T

O que você quer realmente?
Não consegui entender…
Só uma dica,coloca o código assim.

class Teste{}

vai ajudar bastante!
Valew!!

H

Eis a classe Disciplina:

import java.io.*;
class Disciplina {

Disciplina préRequisitos[];
        Disciplina pósRequisitos[];
        String nome;
        static BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
        private static int tamPre;
        private static int tamPos;            

        Disciplina(String n, int tpre, int tpos) {
                    nome = n;
                    tamPre = tpre;
                    tamPos = tpos;
                    if (tpre > 0)
                               préRequisitos = new Disciplina[tpre];
                    if (tpos > 0)
                               pósRequisitos = new Disciplina[tpos];
        }

        private void definirRequisitos (boolean op) {
              String n = "";
              int tpe;
              int tpo;
              try {
                   if (op)  {
                          for (int ind=0; ind<tamPre; ind++) {
                              System.out.println("Diga o nome do atributo  "+(ind+1) +"\n");                                                            
                              n = entrada.readLine();
                              if (n.equals("*")) {
                                    tamPre = ind+1;
                                    break;
                              }
                              System.out.println("Diga os sub-atributos 1de "+n+": ");
                              tpe = Integer.parseInt(entrada.readLine());
                              System.out.println("Diga os sub-atributos "+n+": ");
                              tpo = Integer.parseInt(entrada.readLine());
                              préRequisitos[ind] = new Disciplina(n, tpe, tpo);                                                            
                          }
                   }
                   else {
                        for (int ind=0; ind<tamPre; ind++) {
                            System.out.println("Diga o nome do atributo "+(ind+1) +"\n");
                            n = entrada.readLine();
                            if (n.equals("*")) {
                                   tamPos = ind+1;
                                   break;
                            }
                            System.out.println("Diga o nome do sub-atributos 1 "+n+": ");
                            tpe = Integer.parseInt(entrada.readLine());
                            System.out.println("Diga o nome do sub-atributo 2  "+n+": ");
                            tpo = Integer.parseInt(entrada.readLine());
                            pósRequisitos[ind] = new Disciplina (n, tpe, tpo);
                      }
                  }
            }
            catch (Exception e) {
                  System.out.println("Erro ao ler do teclado!");
            }
   }

}

class GradeEscolar {

public static void main (String args[]){

Disciplina a = new Disciplina(prog2, 1, 1);

prog2.definirPréRequisitos();

}

}

Coloquei também o aplicativo onde eu uso essa classe (classe GradeEscolar).
O problema acontece no método definirRequisitos(). Quando eu tento instanciar um objeto para colocar no vetor préRequisitos/pósRequisitos, o valor tamPre/tamPos assume o valor de tpe/tpo, o que não deveria acontecer.
Como instanciar um objeto dentro de sua própria classe sem alterar o valor inicial de seus atributos? Tem como?

Vlw!
(Obs: Desculpe, mas não consegui tabular o texto)

L

Então, não entendi muito bem o que você quer, vou dizer alguns erros só:

public static void main(String args[]) {
		Teste a = new Teste("prog2", 1, 1);
		prog2.definirPréRequisitos();
	}

Ali não ta declarado prog2 e o método definirPreRequisitos requer um param boolean mas vc não passa nada.

Mas bele, isso acho que não deve dar erro ali porque senão vc nem conseguiria rodar.

Agora falando do seu construtor… claro que tamPre e tamPos vai assumir o valor de tpres e tpos, você faz isso no construtor da classe:

Disciplina(String n, int tpre, int tpos) {
		nome = n;
		tamPre = tpre;
		tamPos = tpos;
		if (tpre > 0)
			préRequisitos = new Teste[tpre];
		if (tpos > 0)
			pósRequisitos = new Teste[tpos];
	}

Outra coisa é que tamPre e tamPos são estaticos ou seja, tem o mesmo valor para todas instancias, então se vc fizer:

Disciplina a1 = new Disciplina("prog1", 5, 3);
		Disciplina a2 = new Disciplina("prog2", 4, 7);

Ao rodar definirRequisitos, ambos terão como valor de tamPre e tamPos 4 e 7 respectivamente, pois o ultimo construtor a rodar foi o que passou 4 e 7 e esse setou o atributo estatico da classe modificando o que o outro tinha setado…

Então, eu acho que vc deve estar com um problema onde tem varias disciplinas e elas não guardam o valor (tamPre e tamPos) que vc define para elas, justamente porque a cada nova disciplina vc no construtor altera o atributo estatico que vale para todas… então tira o static desses atributos e ve se vai funcionar o que você quer:

private static int tamPre;
	private static int tamPos;

bele?!

H

Estou enviando essa mensagem primeiramente para agradecer publicamente a luBS pela resposta e declarar aos que lerem futuramente esse tópico que a dica de luBS foi a solução para o problema encontrado.
A partir de agora deixo de observar o tópico.

Criado 19 de julho de 2007
Ultima resposta 26 de jul. de 2007
Respostas 4
Participantes 3