inicializar - Campo booleano mutable en Java
inicializar boolean java (9)
Necesito un campo booleano mutable en Java (devolveré este campo mediante el método get * más adelante y debería ser posible modificar este campo).
Boolean no funciona porque no hay métodos set * en la clase Boolean (diría que Boolean es inmutable, solo puede cambiar la referencia, pero no puede cambiar el objeto en sí).
Supongo que puedo usar una matriz booleana de tamaño 1. ¿Pero probablemente haya soluciones más elegantes?
¿Por qué Java no tiene una cosa tan simple?
¿Por qué no usar la primitiva booleana?
p.ej
private boolean myFlag = false;
public void setMyFlag(boolean flag) {
myFlag = flag;
}
Tenga en cuenta que su método getter puede devolver un Booleano si es necesario, debido a la magia del autoboxing . Esto permite una fácil intercambiabilidad entre el uso de primitivas y sus equivalentes de objeto (p. Ej., Booleano frente a booleano o int frente a entero).
Entonces, para abordar sus respuestas editadas, re. los métodos que tienes disponibles,
public Object getAttribute(String attributeName)
puede implementarse devolviendo un booleano autoboxado.
¿Qué tal si usamos la primitiva booleana?
private boolean value;
public void setValue(boolean value) {
this.value = value;
}
public boolean getValue() {
return value;
}
¿Realmente está diciendo que desea que las personas que llaman puedan modificar el valor booleano del objeto manipulando lo que se devuelve? ¿Para que el objeto y la persona que llama compartirían una referencia?
Para que lo entiendo, dado:
class OddClass { private Boolean strangeFlag; public Object getAttrbiute(String attributeName) { if (attributeName.equals("strangeflag")) return (Object)strangeFlag; ... } }
Y luego la persona que llama lo hace:
Boolean manipulableFlag = (Boolean) myOddClass.getAttrbiute ("strangeflag");
Y luego, si la persona que llama cambia el valor de manipulableFlag
, quiere que ese cambio ocurra en la instancia de OddClass, como si la persona que llama hubiera usado un método setAttrbiute.
¿Es eso lo que estás preguntando?
En ese caso, necesitaría una clase de sostenedor, como lo sugirió Adam.
La respuesta que más me gustó fue de Adam para escribir tu propia clase contenedora ... OK
/* Boolean to be passed as reference parameter */
public class Bool {
private boolean value;
public Bool() {
this.value = false;
}
public boolean is() {
return this.value;
}
public void setTrue() {
this.value = true;
}
public void setFalse() {
this.value = false;
}
}
Las clases inmutables son más fáciles de trabajar. Nunca cambiarán y no habrá problemas con el código concurrente. (Básicamente, hay menos posibilidades de romperlos).
Si desea devolver una referencia a su valor booleano, puede usar java.util.concurrent.atomic.AtomicBoolean
si está trabajando con varios subprocesos o con el antiguo org.apache.commons.lang.mutable.MutableBoolean
.
Puedes usar una matriz booleana
final boolean[] values = { false };
values[0] = true;
Si está usando Android, puede usar los objetos android.util.Mutable * que envuelven varios valores primitivos. Por ejemplo, citando de la fuente SDK:
public final class MutableBoolean {
public boolean value;
public MutableBoolean(boolean value) {
this.value = value;
}
}
Si está utilizando Java 5 o superior, utilice AtomicBoolean
Tal vez escribir usted mismo una clase de envoltura
class BooleanHolder {
public boolean value;
}
O bien, cree una clase de titular genérico (lo que significa que tendrá que usar la clase Boolean
lugar de la boolean
primitiva):
class Holder<T> {
public T value;
}
A continuación, devuelve la clase contenedora en lugar del valor en sí, lo que permite modificar el valor dentro del contenedor.