[RESOLVIDO]Qual a maneira correta de passar/recuperar varios parametros?

To com uma duvida aqui sobre como passar varios parametros diferentes, na verdade passar não é muito o problema, mas sim pra recuperar os dados. Como assim? Por exemplo, se voce tem la varios campos de texto, coloca num HashMap, e busca todos, tranquilo.

metodo(HashMap dados){
    String x = dados.get("x").toString();
}

pra texto é facil. E para número é assim mesmo?

metodo(HashMap dados){
    int x = Integer.parseInt(dados.get("x").toString());
}

funciona mas me parece meio que uma gambiarra, ta certo mesmo?
Mas a duvida mairo seria pra passar outro tipos de dados, como classes, etc. Não tem como passar em uma variavel somente, sem ter que colocar no metodo todos os parametros? Por exemplo eu até passo a classe X por HashMap para um metodo, mas dai como recuperar a classe X do HashMap?

Vo criar aqui uma classe de exemplo so pra ficar mais facil de explicar e alguem por um exemplo em cima.
Classe X

public class X {

    private String campo1;
    private String campo2;
    private String campo3;

    public String getCampo1() {
        return campo1;
    }

    public String getCampo2() {
        return campo2;
    }

    public String getCampo3() {
        return campo3;
    }
}

Como recuperar?

//Em algum codigo de outra classe eu passo
X classeX1 = new X();
X classeX2 = new X();
X classeX3 = new X();
X classeX4 = new X();
HashMap x = new HashMap(0,1);
x.put("x1", classeX1);
x.put("x2", classeX2);
x.put("x3", classeX3);
x.put("x4", classeX4);

//Metodo de outra classe
metodoX(HashMap dados){
    for(int cont=1;cont<=dados.size();cont++){
        //Obtem Classe X
        dados.get("x"+cont);
    }
}

no caso [color=blue]dados.get("x"+cont)[/color] retorna um object, dai como eu faço pra chegar nos valores dos atributos da calsse?
Existe um outro método ou classe que faça isso alem do HashMap?

Por que você está usando HashMaps, em primeiro lugar?

O que te impede de fazer:

public metodo(X x) { //Faz qualquer coisa com o objeto x, da classe X }

Essa passagens por HashMaps é gambi sim, e são poucos os casos onde você deve usa-la.

é esse exemplo da classe fico meio “tosco”, mas então passar dados por HashMap não é uma boa ideia…
O caso é assim, iria colocar em Web, mas como se trata apenas da classe eu coloquei aqui no basico, assim

Eu tenho la os campos no formulario, ai tem la, pra cada campo eu tenho uma verificação, os campos comuns faço uma que serva pra todos, mas do mesmo jeito ainda são varios, dia pra passar pra calsse que faz a verificação eu crio um metodo que recebe o HashMap dos campos e passa pra cada verificação, pra não ter que vericicar um por um tipo assim:

verificaDados(HashMap dados){
    return campo1(dados.get("campo1")) && campo2(dados.get("campo2")) && campo3(dados.get("campo3")) && (campo4(dados.get("campo4")) || campo5(dados.get("campo5")));
    //Onde campoX, é o metodo responsavel pela verificaçãod aquele campo.
}

//Antes de enviar para o banco so faço
if(verificaDados(dados)){
    //Envia
}else{
{
    //Trata o erro
}

Por isso eu to usando HashMap, se não eu teria que passar, [color=blue]verifica(String campo1, String campo2, int campo3, String campo4, int campo 5)[/color], e assim por diante, o que eu queria era justamente não ter que passar campo 1 por 1, logicamente seria mais facil fazer a verificação direto com seu proprio metodo. O problema dessa maneira é justamente recuperar certos tipos de dados como INT, ou BOOLEAN, por isso a duvida.

Conciderando que HashMap seja uma gabiarra, e deixa-lo de lado, a maneira correta seria passar um por 1 para os metodos ou para o metodo verificador?

Simplesmente use um objeto. Isso é tão comum que tem até nome e é um Design Pattern : Context Object
Mas cuidado para não incluir tudo num só context object, às vezes mais do que um context object é necessário.

Se todos os parâmetros forem do mesmo tipo, você pode jogar fora o HashMap e usar varargs:

public metodo(X... objetos) { for (X x: objetos) { // Faz algo com X } }

O melhor mesmo é você agrupar os seus dados em uma classe e passar objetos dessa classe como parâmetro para o método. O código fica mais claro, você não vai ter problemas com casting e é uma solução muito mais elegante.

Já que você comentou que pretende usar isso em web para refletir campos de um formulário, dê uma olhada nas classes de Form do Struts. Elas são exatamente isso, uma espécie de classe Java que representa um formulário HTML.

Abraço!

Realmente, poxa eu fiz a classe pra um exemplo e nem passou pela minha cabeça usar uma classe pra isso, como disse não teria mais problemas com tipos de dados e fica bem legivel… Gostei, de primeira mão isso resolve mas vou dar uma olhada na dica, ja que tem algo pronto pra isso, provavelmente deve ter coisa a mais muito boa la nos “Form do Struts”


Eu não entendi esse “varargs”

public metodo(X... objetos) {
    for (X x: objetos) {
        // Faz algo com X
    }
}

Se eu tiver 30 Strings como parametro eu posso fazer?

    for(String str: objetos){
        //Rodando os 30 parametros
    }

É, os forms do Struts usam este conceito, mas eles só funcionam dentro do Struts. Mas não tem segredo não: basta criar uma classe com os atributos que você quer e criar os getters e setters apropriados.

Sobre o vargargs, é exatamente isso! Este exemplo que você colocou aí deve funcionar normalmente. A única restrição é que o parâmetro que usa o varargs deve ser declarado como o último parâmetro do método.

Abraço

Fecho então, como não comecei com struts axo meio complicado migrar agora, mas fica pra quando for atualizar tudo, eu faço uns testes antes ja utilizando struts, por hora eu vo ficar com a classe mesmo…

Obrigado a todos pela ajuda.