I thought of the following public method:
public RespostaDeArme armar();
The class RespostaDeArme
would look like this:
public class RespostaDeArme {
private final ResultadoDeArme resultado;
private final Set<Integer> zonasAbertas;
public RespostaDeArme(ResultadoDeArme resultado) {
this(resultado, new HashSet<>());
}
public RespostaDeArme(ResultadoDeArme resultado, Set<Integer> zonasAbertas) {
this.resultado = resultado;
this.zonasAbertas = new HashSet<>(zonasAbertas);
}
public ResultadoDeArme getResultado() {
return resultado;
}
public Set<Integer> getZonasAbertas() {
return zonasAbertas;
}
}
public enum ResultadoDeArme {
SUCESSO(1),
ARME_RECUSADO_PARTICAO_JA_ARMADA(2),
ARME_RECUSADO_EXISTEM_ZONAS_ABERTAS(3),
ERRO(4);
private final int numero;
private ResultadoDeArme(int numero) {
this.numero = numero;
}
public int getNumero() {
return numero;
}
}
It only makes sense to call the getZonasAbertas()
method when the result is ARME_RECUSADO_EXISTEM_ZONAS_ABERTAS
.
Question: does this code have any code smell ? The only thing I thought was a possible need to refactor the class containing the armar()
method with Hide Delegate to not need the intermediate RespostaDeArme
to get the zones open (which I do not know would be the case here).
Does anyone see a better way to implement this behavior? If necessary I give more context. I do not like the idea of having two methods in the same class, a armar()
and a getZonasAbertas()
, since the two would have an unnecessary time link (the programmer would need to know to call armar()
first, then the other).
Example usage:
public void executarArme(int idDaCentral) {
RespostaDeArme resposta = conexao.armar();
escritorDaFila.escrever(gerarJsonDeRespostaDeArme(idDaCentral, resposta));
}
private JSONObject gerarJsonDeRespostaDeArme(int idDaCentral, RespostaDeArme resposta) {
JSONObject json = new JSONObject();
json.put("tipoDeMensagem", Mensagens.RESPOSTA_DE_ARME.getNumero());
json.put("idDaCentral", idDaCentral);
json.put("resultado", resposta.getResultado().getNumero());
if (resposta.getResultado() == ResultadoDeArme.ARME_RECUSADO_EXISTEM_ZONAS_ABERTAS) {
json.put("zonasAbertas", new JSONArray(resposta.getZonasAbertas()));
}
return json;
}