Java中的可变布尔字段

时间:2009-09-06 11:46:51

标签: java

我在Java中需要一个可变的布尔字段(稍后我将通过get *方法返回此字段,并且应该可以修改此字段)。

布尔值不起作用,因为布尔类中没有set *方法(我会说布尔值是不可变的,你只能改变引用,但你不能改变对象本身)。

我想我可以使用大小为1的布尔数组。但是可能有更优雅的解决方案?

为什么Java没有这么简单的东西?

9 个答案:

答案 0 :(得分:57)

不可变类更易于使用。它们永远不会改变,并发代码也不会出现问题。 (基本上,打破它们的可能性较小。)

如果您想返回对布尔值的引用,则可以使用java.util.concurrent.atomic.AtomicBoolean,如果您正在使用多个线程或普通的org.apache.commons.lang.mutable.MutableBoolean

答案 1 :(得分:27)

也许自己写一个包装类

class BooleanHolder {
    public boolean value;
}

或制作通用持有人类(这意味着您必须使用课程Boolean而不是原始boolean):

class Holder<T> {
    public T value;
}

然后返回包装类而不是值本身,这允许修改包装器内的值。

答案 2 :(得分:20)

如果您使用的是Java 5或更高版本,请使用AtomicBoolean

答案 3 :(得分:4)

为什么不使用布尔原语?

e.g。

private boolean myFlag = false;

public void setMyFlag(boolean flag) {
   myFlag = flag;
}

请注意,由于autoboxing的魔力,你的getter方法可以在需要时返回一个布尔值。这允许在使用基元和它们的对象等价物之间轻松互换(例如布尔与布尔,或者对整数)。

所以要解决您编辑的回复问题。你可以使用的方法,

public Object getAttribute(String attributeName)

可以通过返回一个自动装箱的布尔值来实现。

答案 4 :(得分:4)

使用布尔原语怎么样?

private boolean value;

public void setValue(boolean value) {
    this.value = value;
}

public boolean getValue() {
    return value;
}

答案 5 :(得分:4)

您可以使用布尔数组

final boolean[] values = { false };
values[0] = true;

答案 6 :(得分:1)

我最喜欢的答案是来自Adam写自己的包装类......好的

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

答案 7 :(得分:0)

如果您使用的是Android,则可以使用包含各种原始值的android.util.Mutable *对象。例如,引用SDK源代码:

public final class MutableBoolean {
  public boolean value;

  public MutableBoolean(boolean value) {
      this.value = value;
  }
}

答案 8 :(得分:-1)

你真的在说你希望调用者能够通过操纵返回的内容来修改对象的布尔值吗?那么对象和调用者会分享对它的引用?

我理解,鉴于:

class OddClass {
   private Boolean strangeFlag;
   public Object getAttrbiute(String attributeName) { 
      if (attributeName.equals("strangeflag")) return (Object)strangeFlag; 
      ...
   }
}

然后来电者做:

   Boolean manipulableFlag = (Boolean) myOddClass.getAttrbiute ("strangeflag");

然后,如果调用者更改manipulableFlag的值,您希望在OddClass实例中进行更改,就像调用者使用setAttrbiute方法一样。

这就是你问的问题吗?

在这种情况下,你需要一个持有人类,如Adam所建议的那样。