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.
}
我想知道这是唯一正确的方法吗?或者还有其他更好的技术或设计模式可以帮助我更好地实现这一点
# 1 楼答案
首先,使用
enum
或静态常量代替幻数(1,2,3)# 2 楼答案
访问者模式通常用于避免这种切换。您可能不想在您的案例中实现完整的模式,但这是值得了解的。JB Nizet的答案在你的情况下可能更实际
见https://en.wikipedia.org/wiki/Visitor_pattern
这些问题可能也会给你一些想法
Java visitor pattern instead of instanceof switch
Java Enums - Switch statements vs Visitor Pattern on Enums - Performance benefits?
# 3 楼答案
我使用EnumMap和一个Enum类型作为它的键来实现它。我定义了一个枚举:
在会话中,我将当前导航的值设置为:
我主要将其设置为:
setActiveUserNavigationStatus(NavigationStatus.HOME);
现在,在构建菜单的地方,我创建了一个EnumMap:
并添加了以下元素:
在单击链接的方法时,我还设置了状态值:
最后,我检查了会话中的当前值,并相应地设置了css类:
这没有switch语句,并且结合了JB Nizet'sArrayList索引和Oli Charlesworth'sEnum的思想
多谢各位
# 4 楼答案
将菜单项存储在数组(或ArrayList)中:
并使用数组的索引作为菜单标识符。收到所选菜单项标识符后,使用
如果标识符不是数字,或者不从0到N,也可以使用映射