Passar ArrayList "0" para um metodo

Estou com o seguinte problema, preciso enviar uma ArrayList de um boolean em determinada situação para um método, em outra situação apenas um valor INT.

Aqui um codico simplificado da minha questão:

[code]protected void Exemplo() {

if (funcao <= 2){

                       MicroAsciiSerialPointLocatorVO dataPointVO = dataPoint.getVO().getPointLocator();

                       List<Boolean>valuesBinary = new ArrayList<Boolean>();

                       for (DataPointRT dp : dataPoints) {
							
                                    boolean value = ((MicroAsciiSerialPointLocatorRT) dp.getPointLocator()).getVO().getValue();
									
                                    if (!valuesBinary.contains(value))
                                            valuesBinary.add(value);
 	                                }

} else {
int valueInt = dataPointVO.getValue()
}

MicroAsciiSerialRequest req = new MicroAsciiSerialRequest();

req.ProcVar(Funcao, ???, ???); // passar a ArrayList ou valor inteiro de acordo a funcao.
[/code]

Método em outra classe

[code]public String ProcVar( int Funcao, ???, ???) {// receber ArrayList ou valor inteiro

// codico
}[/code]

Se eu não passar um os dois valores, dará erro em uma das variáveis. Eu teria que enviar a ArrayList com valor zero, como faco isso?

se só precisa de um dos parâmetros passados faça uma sobrecarga.
mas se vc precisa realmente passar a lista passe ela nula.

Faça dois métodos, um que recebe int e outro que recebe ArrayList. Métodos sobrecarregados, como o amigo yhhik disse.

Abraço!

Se passar como null da erro, por isso abri o tópico. Na verdade tenho que passar umas 8 variáveis para o método, não sei se vou conseguir separar em dois métodos. Ja que tenho uma logica comum no final do método.

para isso que serve a sobrecarga…crie quantos quiser.
flw

Entendi o que é a sobrecarga, mas não sei a melhor maneira de separar o meu método. O que é passado para método são 7 variáveis e um Case com 5 opções de acordo com a função que me retorna um codico, esse codico é processado (PosCodico) e seria onde tenho o resultado do método, por isso fiz tudo em um método apenas. Se eu separar vou ter repetir a logica do PosCode?

Você precisa passar sempre uma ou outra ou seu metodo depende das duas variaveis…

Se for em alguns momentos o int e em outras o arrayList, sobrecarga seria uma boa opção…porem não tem sentido vc repetir o conteudo do metodo.

Veja se não é possivel separar a logica…

rafael.luc, boa tarde!

Amigão, posta teu método completinho aqui para nós darmos uma olhada e guiarmos a ti na melhor forma de resolver, vai ser mais fácil.

Abração!

Aqui esta:

[code]public class MicroAsciiSerialMaster {

static String codeFunc1, codeFunc4, codeFunc5;
boolean enableWrite = true;
String PosCode;

public String ProcVar(int reqSlaveId, int reqFunctionMode,
		int reqTagUnit, int reqValue, boolean reqAccessRw,
		boolean[] reqValuesBinary, int reqValueInt) {

	String code = "";
	int cont = 1;
	int valueOut = 0;

	// Start of group tags and some of values binary
	if (reqFunctionMode <= 2) {

		while (reqTagUnit > 8) {
			cont = cont + 1;
			reqTagUnit = reqTagUnit - 8;
		}

		if (reqAccessRw == true) {
			int a = 8 * (cont - 1);
			int b = 8 + a;
			int i = 0;
			for (boolean s : reqValuesBinary) {
				if (i >= a && i < b) {
					if (s == true) {
						valueOut = valueOut + (int) Math.pow(2, (i - a));
					}
				}
				i++;
			}
		}
	}
	// End

	switch (reqFunctionMode) {

	case 1:

		if (reqAccessRw == true) {

			code = reqSlaveId + "1" + String.format("%02d", cont) + "1"
					+ String.format("%03d", valueOut);

			if (!code.equals(codeFunc1)) {

				codeFunc1 = code;

			} else {
				enableWrite = false;
			}

		} else {
			code = reqSlaveId + "1" + String.format("%02d", cont) + "0000";
		}
		break;

	case 2:

		code = reqSlaveId + "2" + String.format("%02d", cont) + "0000";

		break;

	case 3:

		code = reqSlaveId + "3" + String.format("%02d", reqTagUnit)
				+ "0000";

		break;

	case 4:

		if (reqAccessRw == true) {

			code = reqSlaveId + "4" + String.format("%02d", reqTagUnit)
					+ "1" + String.format("%03d", reqValueInt);

			if (!code.equals(codeFunc4)) {

				codeFunc4 = code;

			} else {
				enableWrite = false;
			}

		} else {
			code = reqSlaveId + "4" + String.format("%02d", reqTagUnit)
					+ "0000";
		}
		break;

	case 5:

		if (reqAccessRw == true) {

			code = reqSlaveId + "5" + String.format("%02d", reqTagUnit)
					+ "1" + String.format("%03d", reqValueInt);

			if (!code.equals(codeFunc5)) {

				codeFunc5 = code;

			} else {
				enableWrite = false;
			}

		} else {
			code = reqSlaveId + "5" + String.format("%02d", reqTagUnit)
					+ "0000";
		}
		break;

	}

	// Start CheckSum
	int someCheckSum = 0;
	byte bytesCheckSum[] = code.getBytes();

	for (int i = 0; i < code.length(); i++) {
		someCheckSum = someCheckSum + (bytesCheckSum[i] - 48);
	}
	// End

	PosCode = code + String.format("%02d", someCheckSum);

	return PosCode;

}

}
[/code]

A logica CheckSun tem apenas 4 linhas, poderia repeti-lo, mas estou vendo a melhor forma de resolver, ao meu ver seria 3 metodos. Um com com ArrayList outro com valor Int e outro com CheckSun.

Resolvi da seguinte forma, apenas não sei se foi a melhor.

[code]package rt;

import java.util.List;

public class MicroAsciiSerialRequest {

String preCode, posCode;
static String codeFunc1, codeFunc4, codeFunc5;
boolean enableWrite = true;

public String ProcVar(int reqSlaveId, int reqFunctionMode, int reqTagUnit,
		boolean reqAccessRw, List <Boolean> reqValuesBinary) {

	int contTags = 1;
	int valueByte = 0;

	while (reqTagUnit > 8) {
		contTags = contTags + 1;
		reqTagUnit = reqTagUnit - 8;
	}

	if (reqFunctionMode == 1) {

		if (reqAccessRw == true) {
			int a = 8 * (contTags - 1);
			int b = 8 + a;
			int i = 0;

			for (boolean s : reqValuesBinary) {
				if (i >= a && i < b) {
					if (s == true) {
						valueByte = valueByte + (int) Math.pow(2, (i - a));
					}
				}
				i++;
			}

			preCode = reqSlaveId + "1" + String.format("%02d", contTags)
					+ "1" + String.format("%03d", valueByte);

			if (!preCode.equals(codeFunc1)) {

				codeFunc1 = preCode;

			} else {
				enableWrite = false;
			}

		} else {
			preCode = reqSlaveId + "1" + String.format("%02d", contTags)
					+ "0000";
		}
	}

	if (reqFunctionMode == 2) {

		preCode = reqSlaveId + "2" + String.format("%02d", contTags)
				+ "0000";

	}
	
	int someCheckSum = 0;
	byte bytesCheckSum[] = preCode.getBytes();

	for (int i = 0; i < preCode.length(); i++) {
		someCheckSum = someCheckSum + (bytesCheckSum[i] - 48);
	}

	posCode = preCode + String.format("%02d", someCheckSum);

	return posCode;
}

public String ProcVar(int reqSlaveId, int reqFunctionMode, int reqTagUnit,
		boolean reqAccessRw, int reqValueByte) {

	switch (reqFunctionMode) {

	case 3:

		preCode = reqSlaveId + "3" + String.format("%02d", reqTagUnit)
				+ "0000";

		break;

	case 4:

		if (reqAccessRw == true) {

			preCode = reqSlaveId + "4" + String.format("%02d", reqTagUnit)
					+ "1" + String.format("%03d", reqValueByte);

			if (!preCode.equals(codeFunc4)) {

				codeFunc4 = preCode;

			} else {
				enableWrite = false;
			}

		} else {
			preCode = reqSlaveId + "4" + String.format("%02d", reqTagUnit)
					+ "0000";
		}
		break;

	case 5:

		if (reqAccessRw == true) {

			preCode = reqSlaveId + "5" + String.format("%02d", reqTagUnit)
					+ "1" + String.format("%03d", reqValueByte);

			if (!preCode.equals(codeFunc5)) {

				codeFunc5 = preCode;

			} else {
				enableWrite = false;
			}

		} else {
			preCode = reqSlaveId + "5" + String.format("%02d", reqTagUnit)
					+ "0000";
		}
		break;

	}
	int someCheckSum = 0;
	byte bytesCheckSum[] = preCode.getBytes();

	for (int i = 0; i < preCode.length(); i++) {
		someCheckSum = someCheckSum + (bytesCheckSum[i] - 48);
	}

	posCode = preCode + String.format("%02d", someCheckSum);

	return posCode;
}

}[/code]

rafael.luc, bom dia!

Pelo que pude ver, o método ProcVar não recebe um ArrayList, mas sim um Array do tipo boolean em um de seu argumentos. Não será essa a confusão?

Fiz uns testes aqui e o método funciona perfeitamente. Veja:[code]public class Modelo {

public static void main (String[] args) {
	boolean[] valoresBin = {true, false, true, true};
	
	MicroAsciiSerialMaster masm = new MicroAsciiSerialMaster();

	System.out.println( masm.ProcVar(20, 1, 71, 11, true, valoresBin, 9) );

}

}[/code]Saída:[quote]20109100013[/quote]Caso o Array não tenha um número de índices prédefinido, você pode usar um ArrayList, sim, porém antes de passar ao método é só converter para um Array. Veja um exemplo:[code]import java.util.ArrayList;

public class Modelo {

public static void main (String[] args) {
	// boolean[] valoresBin = {true, false, true, true};

	ArrayList<Boolean> listBin = new ArrayList<Boolean>();
	listBin.add(true);
	listBin.add(false);
	listBin.add(true);
	listBin.add(true);

	// Converte a ArrayList<Boolean> em boolean[] (primitivo)
	boolean[] valoresBin = new boolean[listBin.size()];

	for(int i = 0; i < valoresBin.length; i++)
		valoresBin[i] = listBin.get(i).booleanValue();
	
	MicroAsciiSerialMaster masm = new MicroAsciiSerialMaster();

	System.out.println( masm.ProcVar(20, 1, 71, 11, true, valoresBin, 9) );
}

}[/code]Tem o mesmo resultado. Espero que isso te ajude.

Abraço e boa sorte!

Aqui esta meu codico de teste para o envio

[code]public class MicroAsciiSerialDataSource {

int porta = 1;
Vo vo = new Vo();
MicroAsciiSerialRequest request = new MicroAsciiSerialRequest();

protected void doPoll() {
	vo.Valores();
	for (int i = 0; i < 2; i++){ // para teste "repetido"
		
	if (porta == 1) {
            // Como vai ser no programa

           // for (DataPointRT dataPoint : dataPoints) {
			
				   // MicroAsciiSerialPointLocatorVO dataPointVO = dataPoint.getVO().getPointLocator();
				
				  //  if (dataPointVO.getFunctionMode() =< 2){
					
				          //  List<Boolean>valuesBinary = new ArrayList<Boolean>();
				
				           // for (DataPointRT dp : dataPoints) {
							
                                   // boolean bit = ((MicroAsciiSerialPointLocatorRT) dp.getPointLocator()).getVO().getValue();
									
                                   // if (!valuesBinary.contains(bit))
                                          //  valuesBinary.add(bit);
 	                              //  }

                 // Fim do programa real

	 List<Boolean> valuesBinary = new ArrayList<Boolean>();
	    for(boolean bit: vo.valueBit){
		    boolean value = bit;
		    valuesBinary.add(value);
	    }
        
		if (vo.getFunctionMode() <= 2){
		request.ProcVar(vo.getSlaveId(), vo.getFunctionMode(),
				vo.getTagUnit(), vo.isAccessRw(), valuesBinary);
		}else{
			request.ProcVar(vo.getSlaveId(), vo.getFunctionMode(),
					vo.getTagUnit(), vo.isAccessRw(), vo.valueByte);
		}

		if (request.enableWrite == true) {
			System.out.println(request.posCode);

		} else {
			System.out.println("repetido"); // para teste

		}
		[/code]

@Vingdel, eu não entendi bem o que disse, depois vejo com mais atenção. Para testar meu codico seria:

Slave: 1-9
funcao: 1-5
Tag: 1-99

valor 0-255

Se reparar eu passo o valor de 8 bits para um byte que forma um valor Int, isso é para passar 8 valores em um único codico, ou seja em bloco.
Nesse meu tópico tem mais informação( ou desinformação hehehe):

A minha resposta foi baseada no primeiro exemplo de código que você deu, a sua postagem com a alteração foi feita enquanto eu estava escrevendo a minha e não a tinha visto.

Seu problema está resolvido?

Abraço!