相同中的不同:Java程序员应该停止低看C#

发表于:2011-5-25 09:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:贾隆译    来源:51Testing软件测试网采编

分享:

  真正的泛型(True Generic)

  关于泛型,Java和C#显示出语法上的相似性,但真正深入理解之后你会发现这两种语言在泛型处理上的差别很大。

  Java的泛型是在编译器中处理的,运行时并不关心泛型类型。Java在编译中使用叫做类型擦除转换的泛型类与方法:所有的泛型类型都被它们的原始版本替换,并且会在客户代码中插入cast和类型检查,生成的字节代码中并不包含任何泛型类型或参数的引用。Java的泛型是让你在语法编写上尝到甜头,但不会让你的应用执行起来更有效。

  而C#的泛型并不全是语言上的功能,它是放置在CLR(Common Language Runtime, 相当于JVM)中的。在编译时需要进行泛型类型检查验证,但指定类型会推迟到类装载时生成。代码调用时的泛型是完全编译的,而且可以假设泛型在类型上是安全的,这被称为泛型的具体化。和Java不同,C#不需要插入cast或者类型检查。泛型类型和方法可以通过引用(class、delegate、interface等)和值类型(primitive type、struct、enum等)来创建。

  C#中泛型的使用能够带来效率的提高(不需要cast和值类型的boxing/unboxing),还能够提高深层次的安全验证和反映能力。

  1. public void AwesomeGenericMethod(T t) where T : new() 
  2.   T newInstance = new T (); // Causes a type creation error in Java 
  3.   T[] array = new T [0]; // Causes generic array creation error in Java 
  4.   T defaultValue = default(T); 
  5.   Type type = typeof(T); 
  6.   List list = new List (); 
  7. // Generic with same name but a different number of generic type 
  8. public void AwesomeGenericMethod(T t, U u) where T : new() 
  9. }

  Oracle的Java平台总架构师Mark Reinhold在Devoxx 2011大会上曾经探讨过给Java添加泛型的具体化问题,但这项功能还没有规划进Java的下一个主要版本中。

  告别被检查异常(checked exception)

  Java和C#的异常检查工作差不多一样,二者唯一的主要区别是:Java中包含了checked exception这样的异常。在Java里你可以在方法声明中抛出ExceptionType,这样做可以强迫任何调用方法的函数来处理异常。这个想法在纸面上说说很好,但实际使用中却很烦人,而且带来了新问题。

  版本问题:在新版本的方法声明中加入一个checked exception会破坏客户代码,就像给一个接口添加方法一样。比如在版本1中你创建了一个foo方法,声明抛出异常A和B,在版本2中你添加了一些新功能,抛出异常D,这就是一个破坏性变化,因为现有的调用程序不能处理这个异常。

  扩展性问题:在大规模的应用项目中,相互依赖的工作是非常多的,因此抛出的异常会多的难以统计,开发者经常会绕开掉这个功能,通过抛出泛型异常或者使用空的catch块。

  checked exception背后的思路是了不起的,但是尤其在大项目中,它有点太强迫性了。这就是C#为什么不使用checked exception的原因,其他主流语言也一样:留给开发者自己处理。

  访问器和修改器

  Java的访问器和修改器(getAddress、setAddress、isValid等)使用命名惯例。而在C#中,访问器和修改器是内置的,自身带有属性,不需要再写getter和setter,所有的工作看上去都是直来直去,即使内部并不是这样的机制(许多其他语言也是这样)。

  1. class Meme 
  2.   // A private backing field is created by the compiler 
  3.   public string CatchPhrase { getset;} 
  4.   public string URL { getset;} 
  5. Meme meme = new Meme(); 
  6. meme.CatchPhrase = "Rick roll'd"
  7. meme.URL = "http://www.youtube.com/watch?v=EK2tWVj6lXw"
  8. // Equivalent in Java 
  9. class Meme 
  10.   private String catchPhrase; 
  11.   private String url; 
  12.   public String getCatchPhrase() 
  13.   { 
  14.     return catchPhrase; 
  15.   } 
  16.   public void setCatchPhrase(String catchPhrase) 
  17.   { 
  18.     this.catchPhrase = catchPhrase; 
  19.   } 
  20.   public String getUrl() 
  21.   { 
  22.     return url; 
  23.   } 
  24.   public void setUrl(String url) 
  25.   { 
  26.     this.url = url; 
  27.   } 
  28. }

32/3<123>
价值129的会员专享直播免费赠送,添加微信领取听课名额哦~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海漕溪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号