【问题标题】:Alternatives for switch statementswitch 语句的替代方法
【发布时间】:2012-05-05 20:35:50
【问题描述】:

我正在开发一个 Wicket 应用程序。但我的问题与 Wicket 无关。在那个应用程序中,我有一个水平菜单。此菜单由几个链接创建。单击链接后,您将被导航到某个页面。现在根据您当前正在查看的页面,菜单链接的 css 类属性将更改为“已选择”。这是问题的描述。

现在我通过使用整数值来解决这个问题。该值保存在会话中,并在单击任何一个链接时更新。根据保存的值,将在运行时确定“选择”哪个链接。

我正在通过以下方式实现:

//On link click I set a number in session

public void onClick() {
    session.setValue(1);// or 2 or 3
}

菜单创建时我在值之间切换并修改css类,如下:

switch(session.getValue){
    case 1: add css to home;
    case 2: add css to profile;
    // and so on.
}

我想知道这是唯一正确的方法吗?或者还有其他更好的技术或设计模式可以帮助我以更好的方式实现这一目标?

【问题讨论】:

    标签: java design-patterns switch-statement


    【解决方案1】:

    将菜单项存储在数组(或 ArrayList)中:

    items[0] = home
    items[1] = profile
    

    并使用数组的索引作为菜单标识符。当您收到选定的菜单标识符时,使用

    检索相应的项目
    items[selectedItem]
    

    如果标识符不是数字,或者不是从 0 到 N,您也可以使用 Map。

    【讨论】:

      【解决方案2】:

      首先,使用enum 或静态常量代替幻数(1、2、3)。

      【讨论】:

        【解决方案3】:

        访问者模式通常用于避免这种切换。您可能不想在您的案例中实现完整的模式,但值得了解。 JB Nizet 的回答在您的情况下可能更实用。

        https://en.wikipedia.org/wiki/Visitor_pattern

        这些 SO 问题也可能会给你一些想法

        Java visitor pattern instead of instanceof switch

        Java Enums - Switch statements vs Visitor Pattern on Enums - Performance benefits?

        【讨论】:

          【解决方案4】:

          我已经使用 EnumMap 和一个 Enum 类型作为它的键来实现它。我已经定义了一个枚举:

          public enum NavigationStatus {
              HOME,
              PROFILE;
          }
          

          在会话中,我将当前导航的值设置为:

          private NavigationStatus activeUserNavigationStatus;
          
          public NavigationStatus getActiveUserNavigationStatus() {
              return activeUserNavigationStatus;
          }
          
          public void setActiveUserNavigationStatus(NavigationStatus activeUserNavigationStatus) {
              this.activeUserNavigationStatus = activeUserNavigationStatus;
          }
          

          我主要将其设置为:setActiveUserNavigationStatus(NavigationStatus.HOME);

          现在我创建了一个 EnumMap:

          EnumMap<NavigationStatus, Component[]> menuMap = new EnumMap<NavigationStatus, Component[]>(NavigationStatus.class);
          

          并向其添加元素,如:

          menuMap.put(NavigationStatus.HOME, new Component[] { homeContainer, home });
          

          在链接的点击方法上我也设置了状态值:

          public void onClick() {
              session.setActiveUserNavigationStatus(NavigationStatus.PROFILE);
          }
          

          最后,我检查了会话中的当前值并相应地设置了 css 类:

          Component[] menuComponents = menuMap.get(getSession().getActiveUserNavigationStatus());
          menuComponents[0].add(new AttributeAppender("class", new Model<Serializable>(" active")));
          menuComponents[1].add(new AttributeAppender("class", new Model<Serializable>(" active")));
          

          这里没有switch语句,结合了JB Nizet'sArrayList索引和Oli Charlesworth'sEnum的思想。

          谢谢。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-19
            • 1970-01-01
            • 1970-01-01
            • 2022-11-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-22
            相关资源
            最近更新 更多