java - 如何从另一个类中获取布尔值?
问题描述
我有一个 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;
}
解决方案
您可以按如下方式使用单例类(您可以将单例类重命名为您希望的任何其他名称。)
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 的新实例,并且不会达到目的。
推荐阅读
- python - 在两个列表中迭代递增的值
- c++ - to_string().length() 在 c++ 中给出不正确的结果。谁能解释一下这种行为?
- unity3d - 我可以仅通过 python 经验学习 Unity 吗?
- python - 将数据列写入 txt 文件中的行/行
- java - Rabin Karp 算法运行速度比 naive 慢
- c# - 使用 Polly httpClient ConfigureAwait(true) 重试模式
- python - 我在 python 中的文件和目录上测试模块时遇到问题
- reactjs - React 联系表单中的 CORS 错误 Firebase 云函数
- r - 根据不同图表上的类型制作图表
- r - 给定这个循环组的生成器,我如何构造一个矩阵?