枚举对异常:应用程序错误处理新敏捷方法

日期: 2013-07-22 作者:Randall Nagy翻译:蒋红冰 来源:TechTarget中国 英文

高效的错误处理是一项挑战,而且是应用开发团队必须直接面对的。然而,但是因为Java 5中对于枚举类型的介绍,敏捷开发团队开始意识到只有很少的资源密集型资源方法处理错误,而这些都会导致了枚举和异常的激烈辩论。

当谈及到设计模式和最佳实践时,例如像把读取与写入分开这样的想法就很好。其它一些想法,如限制开发者使用指针,这样的法很糟。最后,像青睐于异常超于枚举这样的想法,已经很老旧了。

异常很邪恶吗?

不仅异常邪恶,与之相关的堆栈及内存成本可能常常会导致使用异常特别昂贵。但是,不使用异常,是否有更好的方法来处理代码中意想不到的问题?确实是有的,为了展示更好的替代方案,通过观察异常究竟在使用和创建什么,来给讨论作一个基准。下面是一个简单的异常类:

public class Exceptional extends Exception { 
/* Often this is empty, as the only need is to create a new Exception type */
}

使用异常来创建一个简单的响应的网络影响,就如我们想象的一样无知,是创建一个代码和内存沙洲。下面是创建处理异常的代码的一下典型的转换:

try { 
  … 

catch(Exceptional ex) { 

catch(IOException ex) { 

catch(Exception ex) { 
}

如果开发人员只是想创建一个内部进程通信标志,那么为什么还要首先创建一个可抛出的类型对象?为什么不用一个枚举类型代替呢?

虽然枚举类型实质上是一个类,这个类是从异常相关的繁重的生命周期中脱离出来的:

public enum foonum { 
   one, two, three; 
   public static void SayHello(foonum val) { 
       System.out.println(“Hello ” + val); 
   } 
   public void greeting() { 
       System.out.println(“Greetings ” + this); 
   } 
  public static void main(String … args) { 
      SayHello(foonum.two); 
      foonum.two.greeting(); 
  }    
}

与其实中关键字new来创建实例,枚举本身中的每一个部件都是垃圾信赖(garbage reliant),而且准备好了为我们随时可用。

枚举类型的好处

曾经对高性能和效率给予关注的的C++开发人员,他们天生就能解决诸如运行时类型识别和异常。以这种方式关掉无用的膨胀功能,是C++永远比.NET或Java要快的一个原因。

但是因为枚举类型走入Java中要比C++晚,许多开发人员还在继续使用,这已经成为处理异常的一种传统方法了。但是使用枚举,正如下面例子一样,更加的有帮助:

public class Alternative { 
   enum Exceptional { 
       ea_Good, 
       ea_Bad, 
       ea_Ugly 
   } 
  public Exceptional Groovy() { 
      return Exceptional.ea_Good; 
  }    
}

因此,与其在我们代码使用繁重的旧的方法,为什么不只返回一个开放式枚举代替呢?

public void Cool() { 
    switch(Groovy()) { 
        case ea_Good: 
            break; 
        case ea_Bad: 
            break; 
        case ea_Ugly: 
            break; 
        default: 
            break; 
    } 
}

确实,如此的努力工作只是为了避免未来的异常,当使用一个转换时,默认块工作比任何类型的finally声明都努力,因为没有超级块标志需要设置:

boolean imadoofus = false; 
try { 
  … 

catch(Exceptional ex) { 
  imadoofus = true; 

catch(IOException ex) { 
  imadoofus = true; 

catch(Exception ex) { 
  imadoofus = true; 

finally { 
  if(imadoofus) { 
     … 
  } 
}

甚至自由使用单个枚举类型集合都能够使代码更加易读、易维护和更容易改进。每个开发人员都需要跟上,在标准更新时发生的连锁效应。保留创建自定义异常来管理不可恢复的错误,是开发人员需要适应的一个新实践。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

翻译

蒋红冰
蒋红冰

TechTarget云计算主编,主要负责云计算和虚拟化网站的内容建设。长期专注于IT前沿技术,对云计算、虚拟化、人工智能、区块链等技术都有了解;对行业趋势、市场动态有一定的洞察。

相关推荐

  • DevOps和敏捷相结合 改进软件质量

    DevOps实际上是打破了开发人员和运维人员之间的壁垒。在运维团队,你所考虑的方面可能与开发团队不同。但如果我们能更加了解相互的工作,将会更为深入得理解所需的工具和设备。

  • 协作对敏捷方法的重要性

    协作的意思说是一起工作,而不是单独去完成某项任务。敏捷方法强调了与跨功能团队合作的好处,大大加强了业务负责人之间的沟通。

  • 敏捷扩展的九条原则

    对于敏捷扩展,并没有按部就班的方法,但有了固定的原则,软件开发团队将会有据可依地创建高质量的企业软件。

  • 敏捷式 vs. 瀑布式:软件需求最佳方式

    确定软件需求很困难。很好地理解客户需求,在改变发生时维护文档和需求都不是容易的事情。