Casting é um problema?

Pessoal, estou querendo desenvolver com o padrão DAO classes para persistir meus objetos via file, rdbms e até mesmo via xml-rpc. Por isso a interface deve ser bem simples e genérica, e todas as operaçoes gostariam que fossem feitas pela interface, e com isso, tenho que usar Casting de dados para funcionar, algo do tipo:

[code]
public interface IStore {
public Object getObject (String name);
}

public class ServerDAO implements IStore {
public Object getObject (String name) {
return new Server(name);
}
}

ServerDAO serverDAO = (ServerDAO) StoreManager.getStorageManagerDAO(“server”);
Server server = (Server) serverDAO.getObject(“localhost”);
out.print(server.getHostname());[/code]

Vejam que precisei fazer o casting com = (ServerDAO) e = (Server), já que na interface retorna Object. É ruim usar casting? Tem forma melhor? Usando generics seria mais simples e não precisaria de casting?

Abraços,

Davi

Cara eu tb tenho essa duvida, pois estou estudando o hibernate e vejo que ele usa cast a doidado para pegar um JavaBean…

Unica coisa q posso lhe dizer é que usando generics você força o cast a ser de uma classe só.

hehehe, cade os cobras pra ajudar a gente?

Bom dia galera,

No meu ponto de vista você poderia utilizar um sobrecarga de metodos para os tipos de objetos que vc deseja retornar … assim te daria mais trabalho na criaçao da classe fabrica mais facilitaria o uso no desenvolvimento dos componentes que à utilizariam… ou caso isso não fosse possivel eu impleentaria o generics em ultimo caso faria dessa forma pois enche o saco ficar fazendo cast e outra ao liberar o cast de object vc abre portas para quem for utilizar sua classe errar, pois qualquer coisa faz cast de object … então compila qualquer cast mais em execução pode dar pau então … não que o cast seja ruim … ele apenas não é muito mais facil … quanto os outros metodos.

é isso que eu penso …

Não vejo problema nenhum em fazer Cast.

Faça-o se necessário. Mas se precisar usar, não tem problema.

Abraço

Caso usar o java Tiger(1.5) ou superior use a sobrecarga de método como o dipeloco falou. Fica assim:

public interface IStore {
 	public Object getObject (String name);
 }
 
 public class ServerDAO implements IStore {
 	public Server getObject (String name) {
 		return new Server(name);
 	}
 }
 
ServerDAO serverDAO = (ServerDAO) StoreManager.getStorageManagerDAO("server");
Server server = serverDAO.getObject("localhost");
out.print(server.getHostname());

Blz!
Mas ainda fica uma duvida.
O Cast é oneroso??

Rapaz vc pode deixar essa sua interface muito mais genérica usando generics cara :slight_smile: e sem a necessidade de castings :smiley: a pergunta necessáriamente é se vc pode usar java 5 se for feito aqui no trabalho que tem projeto como o meu… q eh java 1.4 struts 1.1 aí vc não tem outra solução a não ser o cast se quiser usar somente essa interface… mas caso vc possa usar… vai a dica USE generics :slight_smile:

public interface IStore<I> {
  	public <I> getObject (String name);
  }
  
  public class ServerDAO implements IStore&lt;Server&gt; {
  	public Server getObject (String name) {
  		return new Server(name);
  	}
  }
  
 ServerDAO serverDAO = (ServerDAO) StoreManager.getStorageManagerDAO("server");
 Server server = serverDAO.getObject("localhost");
 out.print(server.getHostname());

Oba, eu posso usar 1.5 sim, mas com o generic em tenho outro problema, veja…

Erro de sintaxe em ServerStore
The type ServerStore must implement the inherited abstract method IStore.delete(Object)

[code]public interface IStore {
public I get();
public void delete(I instance);
}

public class ServerStore implements IStore {

public void delete(Server instance) {
	// TODO Auto-generated method stub
}

public Server get() {
	return new Server();
}

}[/code]

Ai eu ainda acho que o generics não vai me ajudar muito…
Ou estou fazendo errado ?
abraços

Tem um problema no seu código…
Você tem que especificar no extends IStore o tipo genérico!
Assim:

public interface IStore<I> {
 	public I get();
 	public void delete(I instance);
 }
 
 public class ServerStore implements IStore&lt;Server&gt; {
 
 	public void delete(Server instance) {
 		// TODO Auto-generated method stub
 	}
 	
 	public Server get() {
 		return new Server();
 	}
 }

Entendeu?