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?
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.
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());
Rapaz vc pode deixar essa sua interface muito mais genérica usando generics cara e sem a necessidade de castings 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
public interface IStore<I> {
public <I> getObject (String name);
}
public class ServerDAO implements IStore<Server> {
public Server getObject (String name) {
return new Server(name);
}
}
ServerDAO serverDAO = (ServerDAO) StoreManager.getStorageManagerDAO("server");
Server server = serverDAO.getObject("localhost");
out.print(server.getHostname());
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<Server> {
public void delete(Server instance) {
// TODO Auto-generated method stub
}
public Server get() {
return new Server();
}
}