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 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.
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?
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.
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.
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.