Как получить логическое значение из другого класса? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть служба UDP, которая сообщает нам, является ли число «capicua» или нет.У меня есть класс сервера с логическим значением, которое устанавливает его значение, когда есть или когда нет.Когда я звоню из класса Client, чтобы сказать мне логическое значение, которое я не могу принять даже с помощью getter, setters или возвращая фактическое логическое значение, о чем вы думаете?

//CLIENT CLASS
//TIPICO INFINITY LOOP
        while(true) {
            System.out.println("Introduce un numero de "
                    + "al menos 2 cifras para ver si son capicúas. ");

            //METEMOS EN OUT ALL CONTENT 
            out =intToByteArray(Integer.parseInt(introducirDatos("Numero : "))) ;
            //ESCAPE
            if(byteArrayToInt(out)== 0) {
                System.out.println("Cerramos conexión...");
                break;
            }
            System.out.println("Enviando " + out.length + " bytes al servidor");
            envio = new DatagramPacket(out, out.length, IPServer, port );
            socket.send(envio);
//-------------------------------------------------------------------
            recibo = new DatagramPacket(in, in.length);
            System.out.println("Esperando datagrama...");
            socket.receive(recibo);

            IPOrigin = recibo.getAddress();
            int originPort = recibo.getPort();
            System.out.println("Procedente de: " + IPOrigin + ":" + originPort);

            boolean capicua = Servidor.isCapicua();
            System.out.println(capicua);



        }
        socket.close();
class Servidor{
static boolean capicua = true;

while (true) {

            System.out.println("Esperando datagrama...");

            // CONSTUIMOS NUESTRO DATAGRAMPACKET CON LOS DATOS DEL ARRAY DE BYTES
            recibo = new DatagramPacket(in, in.length);
            // RELLENAMOS EL SOCKET CON ALL CONTENT FROM RECIBO
            socket.receive(recibo);
            // ALMACENAMOS EN 'NUMERO' ALL CONTENT
            numero = new Integer(Cliente.byteArrayToInt(recibo.getData()));

            IPOrigin = recibo.getAddress();
            int port = recibo.getPort();
            System.out.println("Origen: " + IPOrigin + ":" + port);
            System.out.println("Mensaje recibido: " + numero);
            // VISUALIZMOS DATOS
            visualizar(recibo, socket);

            // AQUI ES DONDE TOCAMOS LA INFO RECIBIDA PARA DEVOLVER LA INFO ADULTERADA
            String answr = Integer.toString(capicuar(numero));

            if (numero == capicuar(numero)) {
                capicua = false;
            }
            System.out.println(capicua);

            // METEMOS LA INFO MODIFICADA EN DGP PARA ENVIAR
            // byte[] respuesta = Cliente.intToByteArray(answr);
            out = answr.getBytes();
            // PREPARAMOS EL ENVIO
            envio = new DatagramPacket(out, out.length, IPOrigin, port);
            // ENVIAMOS Y VUELTA A EMPEZAR

            socket.send(envio);
}
public static boolean isCapicua() {
        return capicua;
    }

    public static void setCapicua(boolean capicua) {
        Servidor.capicua = capicua;
    }

1 Ответ

1 голос
/ 03 июня 2019

Вы можете использовать одноэлементный класс следующим образом (Вы можете переименовать свой одноэлементный класс на любое другое имя, какое пожелаете.)

public class SharedValues{

     private static SharedValues sharedValues = new SharedValues();
     //will always return the same instance of this class
     public static SharedValues getInstance() {
        return sharedValues;
     }

     private boolean capicua;

     public void setCapicua(boolean capicua)
     {
         this.capicua = capicua;
     }

     public boolean getCapicua()
     {
        return this.capicua;
     }
}

Затем в классе Servidor и классе Client сделайте следующее:

class Servidor {
    SharedValues sharedValues = SharedValues.getInstance();

    //make sure this while loop code is in a function
    while(true)
    {
        if (numero == capicuar(numero)) {
            sharedValues.setCapicua(false);

        }
    }
}


class Client {
    SharedValues sharedValues = SharedValues.getInstance();

    //make sure this while loop code is in a function
    while(true)
    {
        boolean capicua = sharedValues.getCapicua();
        System.out.println(capicua);
    }
}

Проще говоря, одноэлементный класс - это класс, который может иметь только один экземпляр. Таким образом, один и тот же экземпляр класса SharedValues ​​будет доступен как классу Servidor, так и классу Client. Таким образом, если вы установите значение в Servidor как setCapicua (false) , то в классе Client вы получите его как false, если вы вызовете getCapicua () . Однако вы должны понимать, что как в клиенте, так и в сервидоре экземпляр имеет вид SharedValues sharedValues = SharedValues.getInstance(); Пожалуйста НЕ используйте SharedValues sharedValues = new SharedValues(); Это даст новый экземпляр класса SharedValues ​​и не будет служить цели.

...