Função após construtor

Champ, se quer algo “automatico”, use o annotation @PostConstruct
Assim:

[code]public class Classe {
public Classe {

}

@PostConstruct
public void sayAnything() {
   System.out.println("Olá, chamada "automatica" após o construtor");

}
}
[/code]

Resolve seu caso? :slight_smile:
Abraços.

Que estranho… não funcionou aqui :frowning:

Não conhecia essa anotação, fui testar mas dá o erro: “cannot find symbol
symbol : class PostConstruct
location: class PaiSub”

Update (Adicionando): [size=18]<[/size]Antes de eu testar, pesquisei essa annotation, e encontrei na documentação da API d java, no pacote javax.annotations http://download.oracle.com/javaee/5/api/javax/annotation/package-summary.html mas aqui não está encontrando nem mesmo o pacote… precisa de algum framework?? na documentação faz muita referência ao EJB[size=18]>[/size]

É porque trabalha com injenção e há casos particulares para se aplicar esse annotation.
O retorno do método deve ser void e não pode ter parametros, com exceção do EJB.

Ele cita o EJB pois também utiliza de annotation para a injeção da classe.
E não acha o pacote? Tens J2EE na sua máquina? :slight_smile:

Em geral não é uma boa prática deixar a referência do objeto vazar no construtor.

Seria melhor fazer isso num Factory Method.

Boa tarde Nel,

tentei utilizar sua idéia porem, como o drigo.angelo disse, não funcionou e deu o mesmo erro

Veja abaixo o código:

public class Malha extends Group <SDEE,SDEE,Regiao>{

	public Malha(SDEE root, String idExterno) {
		super(root, idExterno);
	}
	
	@PostConstruct  
	public void add(){
		root.malha.addGroup(this);
	}
	
}

Caro rodrigousp,

Poderia me explicar do que se trata este Factory Method?

Caro nel,

Descobri que para encontrar o símbolo voce deve importar “import javax.annotation.PostConstruct;”

para de dar erro porem não faz efeito algum



import javax.annotation.PostConstruct;

public class Malha extends Group <SDEE,SDEE,Regiao>{

	public Malha(SDEE root, String idExterno) {
		super(root, idExterno);
	}
	
	@PostConstruct  
	public void add(){
		System.out.print("haaaaaaaaaa");
		root.malha.addGroup(this);
		
	}
	
}

Um factory method seria uma boa idéia mesmo ^^

Algo do tipo:

[code]public class Malha extends Group <SDEE,SDEE,Regiao>{

   private Malha(SDEE root, String idExterno) {   //Repare que é private !
       super(root, idExterno);  
   }  
     
      
   public void add(){  
       root.malha.addGroup(this);  
  }

  public static Malha createInstance(SDEE root, String idExterno){
      Malha m = new Malha(SDEE root, String idExterno);
      root.malha.addGroup(m);
      return m;
  }

} [/code]
Assim, qualquer um que quiser uma instância de Malha tem que chamar o createInstance que chama o método que você quer… agora isso só não é 100% seguro para o caso que sua classe Malha seja extendida…

Quanto a essa segurança era só declarar o método como final. Porem será que não existe alguma outra forma?

Alguma outra forma? Pelo menos de garantir que não vá ocorrer NullPointerException

Me deram a idéia de usar Thread pra resolver este problema. A ideia que uma thread separada verificaria se o objeto já está construido más não ta funcionando

Vejam:

public Malha(SDEE root, String idExterno) {
		super(root, idExterno);
		System.out.print(this == null);
		root.malha.addGroup(this);
	}

Imprime no terminal que this não é null mas levanta a exceção NullPointer exception

cara o this não pode ser null no construtor

vc tá me falando que eu não posso fazer
um this.atributo no construtor?

Eu sei mas pq então levanta null pointer exception?

manda o stacktrace ae do nullpointer
e a implementação( se for tua) do addGroup e da classe

public class HashID <Type extends Identification> {
	
	private final int next;
	
	private final Hashtable <Integer,Type> id;
	private final Hashtable <String,Type> idExterno;
	
	public HashID(){
		id = new Hashtable<Integer,Type>();
		idExterno = new Hashtable<String,Type>();
		next = 1;
	}
	
	public void addGroup(Type group){
		id.put(new Integer(next), group);
		idExterno.put(group.getIdExterno(), group);
		group.setId(next);
		next++;
	}
	
	public void removeIdentifier(Type identificable){
		this.id.remove(new Integer(identificable.getId()));
		this.idExterno.remove(identificable.getIdExterno());
	}
	
	public Type getIdentificable(String idExterno){
		return this.idExterno.get(idExterno);
	}
	
	public Type getIdentificable(int id){
		return this.id.get(new Integer(id));
	}
}


public class Malha extends Group <SDEE,SDEE,Regiao>{
	
	
	
	public Malha(SDEE root, String idExterno) {
		super(root, idExterno);
		
		root.malha.addGroup(this);
	}
}

A excessão é nullPointerexception e o erro ocorre ná hora de tentar adicionar o objeto na hash table

um primitivo final, nao inicializado nem sabia que dava pra fazer isso

se o problema tá na hora de inserir no hashtable
tem que ver se tu realmente deu new nessa classe malha, deve ter dado pois senao nem entraria no metodo
ou entao aquele metodo getIdExterno tá alguma coisa errada

era mais facil ver qual linha dava o erro de null pointer

A solução do drigo.angelo tá certa e é 100% segura uma vez que não será possível estender a classe Malha (porque o construtor é privado).

[]'s
Rodrigo

[quote=tabocu]Caro nel,

Descobri que para encontrar o símbolo voce deve importar “import javax.annotation.PostConstruct;”

para de dar erro porem não faz efeito algum

[code]

import javax.annotation.PostConstruct;

public class Malha extends Group <SDEE,SDEE,Regiao>{

public Malha(SDEE root, String idExterno) {
	super(root, idExterno);
}

@PostConstruct  
public void add(){
	System.out.print("haaaaaaaaaa");
	root.malha.addGroup(this);
	
}

}

[/code][/quote]

O provavél motivo é que não está ocorrendo injeção em sua classe.
Já tive a necessidade de utilizar o annotation @PostConstruct e não obtive problemas.

Creio que deva estar em um contexto diferente do qual está sua classe, como um container.
Leia com atenção pois já postaram soluções interessantes pra você.

Abraços.