【问题标题】:How to write code that performs actions based on what type is如何编写基于什么类型执行操作的代码
【发布时间】:2015-09-11 05:22:36
【问题描述】:

当我在这个问题的措辞上苦苦挣扎时,请多多包涵。因此,假设我有一个名为“UserType”的用户定义类型,该类型有 4 个值:North、South、East 和 West。

public enum UserType {
    NORTH, SOUTH, EAST, WEST
}

然后,我想在不同的类中编写一个方法语句,它将根据类型增加两个变量的值。例如,

public class direction {
    private int peopleWhoGoNorth;
    private int peopleWhoGoSouth;

所以 peopleWhoGoNorth 应该在每次调用以下方法时跟踪向北走的人数:

public void whichWay(UserType type) {
        }

我想知道如何在括号之间创建一个语句,它基本上会说:如果类型为 North,则将 1 加到 peopleWhoGoNorth,如果类型为 South,则将 1 加到 peopleWhoGoSouth。我猜 if/else 语句应该这样做,但我不确定语法将如何工作。以下可以吗?

public void whichWay (UserType type){
    if (UserType = NORTH){peopleWhoGoNorth = peopleWhoGoNorth + 1);
    if (UserType = SOUTH){peopleWhoGoSouth = peopleWhoGoSouth + 1);
    }

如果有什么办法可以澄清这个问题,请告诉我。

【问题讨论】:

  • if ( UserType == North )...
  • 对于初学者来说,最后的那些if 语句应该使用== 而不是=... 例如if (UserType == NORTH) [...]
  • 下面的方法是可以的(一旦操作符被固定)。 “基于类型/值执行操作”有三种基本调度:条件(如图所示)、查找表和多态。
  • 我收到错误,指出 UserType 和 North 都无法解析为变量,但是...
  • @Prasad Counter 建议:总是 使用大括号,except 用于单行throwreturn。否则,在条件(不带大括号)中“添加新行”需要一些想法,否则它可能会默默地破坏程序。

标签: java methods types


【解决方案1】:

您可以对枚举使用开关:

public void whichWay (UserType type){
  switch (type) {
    case NORTH:
      peopleWhoGoNorth++;
      break;
    case SOUTH:
      peopleWhoGoSouth++;
      break;
    default:
      throw new IllegalArgumentException();
  }
}

【讨论】:

    【解决方案2】:

    你需要使用==:if (type == NORTH)

    您也可以使用switch 声明:

    switch(type) {
      case NORTH: 
        peopleWhoGoNorth++;
        break;
      case SOUTH: 
        peopleWhoGoSouth++;
        break;
      default: // do nothing
    }
    

    【讨论】:

    • 这将导致 peopleWhoGoNorthpeopleWhoGoSouth 如果 typeNORTH 由于缺少 break 语句而递增。
    • 缺少休息;声明
    • 有没有办法在 EAST 和 WEST 的情况下什么都不做?甚至不抛出异常,什么都不做?
    【解决方案3】:

    您可以简单地将您的type 与您要检查的类型进行比较。

    public void whichWay(UserType type) {
        if (type == UserType.NORTH) {
            //Execute code
        }
        //Other types analog
    }
    

    或者你可以使用 switch 语句:

    public void whichWay(UserType type) {
        switch (type) {
            case NORTH:
                //Execute code
                break;
            //Other types analog
            default:
        }
    }
    

    【讨论】:

    • 糟糕,抱歉。同时我也在积极编辑。又修好了。
    【解决方案4】:

    switchif-else 已涵盖,但您也可以使用 Map 来包含朝给定方向前进的人数。

    public enum UserType {
        NORTH, SOUTH, EAST, WEST
    }
    
    public class Example{
        private final Map<UserType,Integer> typeMap = new HashMap<>();
    
        public void whichWay(UserType type){
            int val = typeMap.getOrDefault(type,0);
            typeMap.put(type,val++);
        }
    }
    

    当然,您需要添加方法来获取这些值以使其有用。

    【讨论】:

      【解决方案5】:

      另一种选择是使用an EnumMap

      private final EnumMap<UserType, Integer> counter = new EnumMap<> (UserType.class);
      {
        for (UserType u : UserType.values()) counter.put(u, 0);
      }
      
      public void whichWay (UserType type){
        counter.put(type, counter.get(type) + 1);
      }
      

      或者使用 Java 8:

      private final EnumMap<UserType, Integer> counter = new EnumMap<> (UserType.class);
      
      public void whichWay (UserType type){
        counter.compute(type, (u, i) -> i == null ? 0 : i + 1);
      }
      

      (注意:这不是线程安全的)

      【讨论】:

        【解决方案6】:

        我会说你在正确的轨道上。

        只考虑方法“whichWay”:

        public void whichWay(UserType type) {
            if(type == UserType.NORTH) { peopleWhoGoNorth++; }
            else if(type == UserType.SOUTH) { peopleWhoGoSouth++; }
        }
        

        【讨论】:

        • 好吧,考虑到 OP 标记了他的问题 Java,我很确定他正在使用 Java ;)
        猜你喜欢
        • 1970-01-01
        • 2012-01-09
        • 2020-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-30
        • 2014-08-05
        • 1970-01-01
        相关资源
        最近更新 更多