有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

switch语句的java替代方案

我正在开发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.
}

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


共 (4) 个答案

  1. # 1 楼答案

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

  2. # 3 楼答案

    我使用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的思想

    多谢各位

  3. # 4 楼答案

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

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

    并使用数组的索引作为菜单标识符。收到所选菜单项标识符后,使用

    items[selectedItem]
    

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