首页 > 解决方案 > 如何从另一个类中获取布尔值?

问题描述

我有一个 UDP 服务,它告诉我们一个数字是否是“capicua”。我有一个带有布尔值的服务器类,它在是或不是时设置它的值。当我从类 Client 调用告诉我即使使用 getter、setter 或返回实际布尔值我也无法获取的布尔值时,你在想什么?

//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;
    }

标签: javaudpdatagram

解决方案


您可以按如下方式使用单例类(您可以将单例类重命名为您希望的任何其他名称。)

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;
     }
}

然后在服务端类和客户端类中,执行以下操作:

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);
    }
}

简单解释一下,单例类就是一个只能有一个实例的类。因此,Servidor 类和 Client 类都将访问 SharedValues 类的同一个实例。如果您因此将 Servidor 中的值设置为setCapicua(false),那么在类 Client 中,如果您调用getCapicua() ,您将得到它为 false 。但是,您必须意识到,在 Client 和 Servidor 中,实例化是SharedValues sharedValues = SharedValues.getInstance();Please DO NOT useSharedValues sharedValues = new SharedValues();这将提供类 SharedValues 的新实例,并且不会达到目的。


推荐阅读