代码之家  ›  专栏  ›  技术社区  ›  Oleg Vazhnev

爪哇中的可变布尔场

  •  35
  • Oleg Vazhnev  · 技术社区  · 15 年前

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

    Boolean不起作用,因为Boolean类中没有set*方法(我认为Boolean是不可变的,您只能更改引用,但不能更改对象本身)。

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

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

    9 回复  |  直到 15 年前
        1
  •  55
  •   Bitcoin Cash - ADA enthusiast    8 年前

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

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

        2
  •  27
  •   Adam Batkin    15 年前

    也许给自己写一个包装类

    class BooleanHolder {
        public boolean value;
    }
    

    或者生成一个通用的holder类(这意味着您必须使用类 Boolean 而不是原始的 boolean ):

    class Holder<T> {
        public T value;
    }
    

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

        3
  •  20
  •   user177800    15 年前

    如果您正在使用Java 5或更高版本,则使用 AtomicBoolean

        4
  •  4
  •   Tom Jefferys    15 年前

    只使用布尔原语怎么样?

    private boolean value;
    
    public void setValue(boolean value) {
        this.value = value;
    }
    
    public boolean getValue() {
        return value;
    }
    
        5
  •  4
  •   Brian Agnew    15 年前

    为什么不使用布尔原语?

    例如

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

    注意,如果需要,getter方法可以返回布尔值,因为 autoboxing . 这使得使用基元和它们的对象等价物(例如布尔值与布尔值,或int与integer)之间的交换变得容易。

    因此,要解决您编辑的答复。你现有的方法,

    public Object getAttribute(String attributeName)
    

    可以通过返回自动盒布尔值来实现。

        6
  •  4
  •   user2218625    11 年前

    可以使用布尔数组

    final boolean[] values = { false };
    values[0] = true;
    
        7
  •  1
  •   Lukas    8 年前

    我最喜欢的答案是亚当写了你自己的包装类…好啊

    /* 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;
         }
     }
    
        8
  •  0
  •   vonWippersnap    9 年前

    如果您使用的是Android,那么可以使用包含各种原语值的android.util.mutable*对象。例如,从sdk源代码引用:

    public final class MutableBoolean {
      public boolean value;
    
      public MutableBoolean(boolean value) {
          this.value = value;
      }
    }
    
        9
  •  -1
  •   CPerkins    15 年前

    您是否真的希望调用者能够通过操作返回的内容来修改对象的布尔值?以便对象和调用方共享对它的引用?

    我明白,鉴于:

    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实例中进行更改,就像调用方使用了setAttorBiute方法一样。

    这就是你要问的吗?

    在这种情况下,你需要一个持有者类,正如亚当所建议的。