switch语句的替代方案

时间:2012-05-05 20:35:51

标签: java design-patterns switch-statement

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

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

我是按照以下方式实现的:

//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 个答案:

答案 0 :(得分:4)

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

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

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

检索相应的项目
items[selectedItem]

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

答案 1 :(得分:2)

首先,使用enum或静态常量而不是幻数(1,2,3)。

答案 2 :(得分:1)

访客模式通常用于避免这种切换。您可能不希望在您的情况下实现完整模式,但值得了解。在你的情况下,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?

答案 3 :(得分:0)

我使用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's ArrayList索引和Oli Charlesworth's Enum的想法。

谢谢。