`
albeter
  • 浏览: 8266 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

用enum代替if.这个设计大家怎么看

阅读更多
十一闲来无事到公司改了段代码,大家看看这个修改适合不。首先放出修改前的原始的代码(经过简化,改了名字,名字随便改的),逻辑很简单,就是前端传一个参数进来,后台根据参数的不同进行不同的逻辑处理。
public class HandleSomething  {

	private Manager manager;

	private  Logger subLogger = LoggerFactory.getLogger(this.getClass());

	/**
	 * entryType ,进入的参数,根据该参数来判断逻辑。
	 * 
	 */
	public static final int VIP_ENTRY_FLOW = 1; // 特殊页面进入

	public static final int INDEX_ENTRY_FLOW = 2; // 首页进入

	public static final int OTHERS_ENTRY_FLOW = 3; // 其他页面进来	

    protected void work( int entryType, long userId,Context context)  {

		if (entryType == VIP_ENTRY_FLOW) {
			context.put("type", vipFlow(userId,context));
			return;
		}
		if (entryType == INDEX_ENTRY_FLOW) {
			context.put("type", indexFlow(userId, context));
			return;
		}
		if (entryType == OTHERS_ENTRY_FLOW) {
			context.put("type", othersFlow(userId,context));
		}
	}

   private int vipFlow(long userId, TemplateContext context) {/*这里的逻辑用到manager和subLogger*/}
   private int indexFlow(long userId, TemplateContext context) {/*这里的逻辑用到manager和subLogger*/}
   private int othersFlow(long userId, TemplateContext context) {/*这里的逻辑用到manager和subLogger*/}
}


修改后:
public class HandleSomething  {

	private static Manager manager;

	private static Logger subLogger = LoggerFactory.getLogger(HandleSomething.class);

    protected void work( int entryType, long userId,Context context)  {
        for (Flow flow : Flow.values()) {
            if (flow.getTag() == entryType) {
                context.put("type", flow.handle(userId, context));
                break;
            }
        }
		
	}

  enum Flow{
        VIP_ENTRY_FLOW(1) {// 特殊页面进入
            @Override
            int handle(long userId, TemplateContext context) {
               /*这里的逻辑用到manager和subLogger*/
        },

        TAOJINBI_ENTRY_FLOW(2) {// 首页进入
            @Override
            int handle(long userId, TemplateContext context) {
               /*这里的逻辑用到manager和subLogger*/
        },
        ADD_TAOJINBI(3){ // 其他页面进来	
            @Override
            int handle(long userId, TemplateContext context) {
              /*这里的逻辑用到manager和subLogger*/
            }
        };
        private final int tag;

        Flow(Integer tag){
          this.tag=tag;
        }
        public int getTag() {
            return tag;
        }
        
        public abstract int handle(long userId, Context context);
    }
}




修改后通过使用枚举类型间接地去掉了if.

我觉得修改之后有以下特点:
优点:1.execute方法的代码更简洁并且减少重复代码
      2.如果要增加新的处理流程只需要在枚举类中增加一个参数类型即可,不用修改execute方法

但是我有个问题:不清楚这样写是否会带来其他问题。例如性能问题和内存问题。

分享到:
评论

相关推荐

    使用JS枚举简化if else

    本文将探讨如何使用枚举(Enum)来简化JavaScript中的if...else语句,从而提高代码的可读性和可维护性。 枚举是一种在多种编程语言中用于定义一组有限的常量集合的数据结构。在JavaScript中,虽然没有内置的枚举...

    7enum和switch语句联合案例分析VC共6页.pdf

    此外,"赚钱项目"这个文件名可能暗示了案例分析中包含了一个实际的商业应用示例,可能是关于如何利用`enum`和`switch`设计一个盈利模式或业务流程的程序。这样的案例将使学习者能更好地理解和掌握这些概念在真实世界...

    C语言enum枚举类型解析共13页.pdf.zip

    在某些情况下,可能需要定义一个大型的枚举集合,这时可以使用枚举类(enum class,C++11引入)来限制枚举常量的作用域,提高代码的封装性。但在C语言中,没有这样的特性,所有枚举常量都是全局的。 7. 枚举与枚举...

    你必须知道的495个C语言问题(PDF)

    3.10 如果我不使用表达式的值, 我应该用++i 或i++ 来自增一个变量 吗? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.11 为什么如下的代码int a = 100, b = 100; long int c = a * b;...

    如何优雅的替换掉Java代码中的if else

    在编程中,尤其是在Java开发中,if-else语句经常被用来处理条件判断和分支逻辑。然而,当if-else嵌套过多时,代码的可读性和可维护性都会大大降低。为了提升代码质量,我们可以采取一些优雅的方式来替换if-else结构...

    article-018-magic-enum:魔术枚举的示例代码

    这段代码演示了如何从字符串安全地恢复枚举值,如果字符串无效,`enum_cast`会返回一个空的`std::optional`。 6. **性能考虑** 虽然魔术枚举提供了许多便利,但需要注意的是,这些额外的功能可能会带来一定的运行...

    精彩编程与编程技巧-在VB中使用枚举变量...

    在Visual Basic (VB) 中,枚举类型的使用使得代码更加易读且易于维护,因为它们用有意义的名字替代了可能难以记忆的数字值。 #### 枚举的声明 在VB中,可以使用`Enum`关键字来声明枚举类型。每个枚举成员默认被...

    JAVA-8-261.zip

    设计这个类是为了防止空指针异常,强制程序员显式处理null值。例如: ```java Optional<String> optional = Optional.ofNullable(getName()); if (optional.isPresent()) { System.out.println(optional.get());...

    基于Python的串口通信(完整资料).doc

    注意,如果系统中有多个Python版本,可能需要使用`pip3`代替`pip`。 `pyvisa`基于NI-VISA库,这是一个由National Instruments提供的库,用于与各种仪器通信。要正常使用`pyvisa`,需要先安装NI-VISA库,可以从官方...

    keil 暗黑配色.txt

    5. **循环语句模板** (`continue`, `do`, `enum`, `for`, `fpointer_type`, `function`, `if`, `ifelse`, `struct`, `switch`, `void`, `while`) 6. **代码编辑器使用的等宽字体** (`font.monospace.cpp=Consolas`) ...

    vb.net任务栏上弹出类似QQ,MSN的消息提

    在Windows系统中,这种功能可以通过使用Shell_NotifyIcon API函数来实现,这个API是Windows Shell的一部分,用于在任务栏图标上显示通知。 首先,我们需要导入System.Runtime.InteropServices命名空间,以便使用...

    C#代码优化的一些案例 c#经典案例.docx

    2. 使用Enum代替硬编码的索引:如果这些选项有明确的业务含义,可以创建一个枚举类型来表示,这样代码更易读且不易出错。 ```csharp enum ColumnType { ExecutionAmount = 0, ChangeAmount, ClaimAmount, ...

    gooleC++编程风格指南

    2. 使用枚举类(enum class)代替普通枚举,以增加类型安全。 九、多线程编程 1. 使用C++11及以后的std::thread、std::mutex、std::condition_variable等标准库进行线程同步。 2. 避免数据竞争,确保临界区的互斥...

    (完整word)C语言判断练习.doc

    16. switch 语句不能用 if 语句来替代,建立函数的目的之一只是提高程序的可读性。 17. 同一数组可以存储不同类型的值,在 switch—case 语句中,不是每个 case 后都要使用 break 语句。 18. 声明为 void 型的指针...

    51单片机C语言编程基础及实例

    51 单片机设计跑马灯的程序用(c 语言)编写 P1 口接 8 个发光二极管共阳,烧入下面程序 #include unsigned char i; unsigned char temp; unsigned char a,b; void delay(void) { unsigned char m,n,s; for(m=20;m>0...

    C语言32以及C++63个关键字及其含义.pdf

    10. `else`:与`if`搭配使用,当`if`条件不成立时执行的代码块。 11. `enum`:枚举类型,用于定义一组命名的整数常量。 12. `extern`:声明变量是在其他地方定义的,实现全局变量的作用。 13. `float`:表示单精度...

    嵌入式系统和linux工程师面试题.docx

    18. 定义布尔变量`TRUE`和`FALSE`通常用`enum`或`typedef`,如`typedef enum {FALSE=0, TRUE=1} bool;`。 19. `const`在C语言中表示常量,推荐使用它代替`#define`,因为`const`是类型安全的,不会引起意外的类型...

    C++编码规范.

    - 使用 `enum` 类型代替一组相关的常量。 - 示例:`enum Color { Red, Green, Blue };`. **原则2.8 使用内置bool类型** - 使用C++的内置 `bool` 类型,而不是 `int`。 - 示例:`bool isAvailable = true;`. **原则...

    设计模式-单例模式(讲解及其实现代码)

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供全局访问点。这种模式在许多场景下非常有用,比如控制共享资源、管理系统级别的对象,如数据库连接池或者线程池等。单例模式的核心在于限制类的...

Global site tag (gtag.js) - Google Analytics