Java中的可变布尔字段

jav*_*red 37 java

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

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

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

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

Tho*_*ung 59

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

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

  • 我在我的java.lang.String注释对象中写了"mutable",并且无法再次更改它.:-) (2认同)

Ada*_*kin 27

也许自己写一个包装类

class BooleanHolder {
    public boolean value;
}
Run Code Online (Sandbox Code Playgroud)

或者创建一个通用的持有者类(这意味着你将不得不使用类Boolean而不是原始的boolean):

class Holder<T> {
    public T value;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这将工作,但大小1的数组有点简单,imho :) (5认同)

小智 20

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

  • @monzonj:`java.util.concurrent`类不使用`synchronized`,它们使用更好的optmized锁结构.当用作"boolean"的包含时,"AtomicBoolean"将具有完全无关紧要的性能开销.如果您能证明其他情况,请告诉我们. (8认同)
  • @monzonj:在任何情况下都没有显着的性能开销.从正确的工作中使用正确的工具也可以获得很多好处.无论你如何看待一些你无法衡量的微观性能,这个高度优化的课程是出于某种原因而创建的,我怀疑你能做得更好. (5认同)
  • @monzonj - 你的断言*"原子赋值只能通过同步来完成"*充其量是错误的,有*lock free synchronization*的概念,如果你真的看看'AtomicBoolean`的源代码,你会看到任何地方都没有使用`synchronized`关键字!你充其量只是传达了错误的信息. (2认同)

小智 6

您可以使用布尔数组

final boolean[] values = { false };
values[0] = true;
Run Code Online (Sandbox Code Playgroud)


Bri*_*new 5

为什么不使用布尔原语?

例如

private boolean myFlag = false;

public void setMyFlag(boolean flag) {
   myFlag = flag;
}
Run Code Online (Sandbox Code Playgroud)

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

因此,要解决您编辑后的回复。你可用的方法,

public Object getAttribute(String attributeName)
Run Code Online (Sandbox Code Playgroud)

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


Tom*_*rys 5

只使用布尔原语怎么样?

private boolean value;

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

public boolean getValue() {
    return value;
}
Run Code Online (Sandbox Code Playgroud)

  • 添加设置事物 _is_ 的能力,用常识术语来说,就是改变界面。因此最好有实际的书面界面更改来表示和跟踪该更改。 (3认同)