【问题标题】:How to define a name that has boolean value true or false如何定义具有布尔值 true 或 false 的名称
【发布时间】:2013-11-16 07:00:02
【问题描述】:

我的程序有许多函数,布尔输入真或假。逻辑是当它离开时,它是真的;正确的时候就是错误的。

所以不要输入

myFuncton(true) //input is left
myFunction(false) //input is right

我希望能够像这样调用 myFunction:

myFunction(LEFT)
myFunction(RIGHT)

这样理解我的程序就容易多了

简而言之,如何在 JAVA 中定义一个带有布尔值的名称?

【问题讨论】:

    标签: java


    【解决方案1】:

    在我看来,布尔值并不是最适合您的情况,因为您的目标不是检查真假,而是查看所需的方向。如果你确实使用了布尔值,哪个方向应该被认为是“真实的”?哪个假的?如果您想添加 UP 和 DOWN 怎么办?同样,布尔值似乎不太合适。

    看起来你最好的选择是使用枚举:

    enum Direction {
      LEFT, RIGHT
    }
    

    然后定义你的方法:

    public void myFunction(Direction dir) {
      if (dir == Direction.LEFT) {
        // go left
      } else {
        // go right
      }
    }
    

    这为您提供了编译时类型检查和自文档(根据 cmets 中的 @sqrfv)的优势,因此比使用字符串或布尔值要好得多。另请注意,枚举可以有参数和方法,因此比字符串或布尔类型更强大。


    例如,我想使用枚举将击键与 Swing Key Bindings 项目的方向相关联,并创建了一个实际上称为 Direction 的枚举,如下所示:

    enum Direction {
       UP("Up", KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)),
       DOWN("Down", KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)),
       LEFT("Left", KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)),
       RIGHT("Right", KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0));
    
       Direction(String text, KeyStroke keyStroke) {
          this.text = text;
          this.keyStroke = keyStroke;
       }
       private String text;
       private KeyStroke keyStroke;
    
       public String getText() {
          return text;
       }
    
       public KeyStroke getKeyStroke() {
          return keyStroke;
       }
    
       @Override
       public String toString() {
          return text;
       }
    }
    

    然后像这样在我的键绑定中使用它:

    class Board2 extends JPanel {
       private static final int PREF_W = 200;
       private static final int PREF_H = 400;
       public static final String DIRECTION = "direction";
       private Direction direction = null;
    
       public Board2() {
          setBorder(BorderFactory.createTitledBorder("Board2"));
          InputMap inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW);
          ActionMap actionMap = getActionMap();
    
          for (Direction dir : Direction.values()) {
             inputMap.put(dir.getKeyStroke(), dir.getText());
             actionMap.put(dir.getText(), new MyArrowBinding(dir));
          }
       }
    
       private class MyArrowBinding extends AbstractAction {
          private Direction dir;
    
          public MyArrowBinding(Direction dir) {
             super(dir.getText());
             this.dir = dir;
             putValue(ACTION_COMMAND_KEY, dir);
          }
    
          @Override
          public void actionPerformed(ActionEvent e) {
             setDirection(dir);
          }
       }
    
       @Override
       public Dimension getPreferredSize() {
          return new Dimension(PREF_W, PREF_H);
       }
    
       public void setDirection(Direction direction) {
          Direction oldValue = this.direction;
          Direction newValue = direction;
          this.direction = newValue;
    
          firePropertyChange(DIRECTION, oldValue, newValue);
       }
    
       public Direction getDirection() {
          return direction;
       }
    }
    

    【讨论】:

    • 枚举是自记录的
    • 枚举并不总是自我记录。不要让任何人使用“自我记录”作为不在他们的代码中放置必要的 cmets 的借口。不过,在这种情况下,它已经足够清楚了。
    • 我觉得值得一提的是枚举可以用在switch
    • @Quincunx:好点,但现在也可以使用字符串。 EnumMap 也是一个非常紧凑和高效的映射。
    【解决方案2】:

    使用 final 变量,final 确保你不能改变变量的值。

    final boolean LEFT = true; 
    final boolean RIGHT = false;
    

    那么你可以像这样使用它们

    myFunction(LEFT)
    myFunction(RIGHT)
    

    【讨论】:

    • 抱歉打错了,谢谢!
    • 实际上Boolean 可以有一个大写的“B”,因为这也是一种类型(并且final Boolean LEFT = true; 由于自动装箱而可以工作)。 final 必须小写。
    【解决方案3】:

    查看定义常量。根据您的使用情况,您会希望它们是公开的/受保护的/私有的。

    static final boolean LEFT = true;

    static final boolean RIGHT = false;

    编辑:将 RIGHT 设为假。

    【讨论】:

      【解决方案4】:
      Final int LEFT = 0
      Final int RIGHT = 1
      

      这就是我的击键方式,除了包括向前和向后。

      【讨论】:

      • Final 应为小写:final
      猜你喜欢
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 2019-07-19
      • 1970-01-01
      • 2017-09-16
      相关资源
      最近更新 更多