C#不如Java的地方:静态导入

开发 后端
今天我们不是要讨论C#与Java的谁是谁非,而是要在他们之中找到差距,以便于大家在工作中更好的克服这些短板和不足。

首先,请原谅我用了一个很土,很有争议的标题。小弟才思枯竭,实在想不出来什么文雅的了,抱歉~~

前言

换了东家后,从一个死忠C# Fans摇身一变,客串了一把Java程序员,可能是受老赵的《Why Java Sucks》系列博文影响太大,刚开始那几天有很大的抵触情绪,后来想想,何不乘此机会深入了解一下Java。

扮演Java程序员两个月以来,受到的折磨比较多,由于以前习惯了微软的饭来张口,衣来伸手的策略,咋角色一转变还真有点不适应,什么都得自己动手。虽然Java社区开源项目无数,框架一大把,但可能是选择太多就更迷茫,还是有点不适应。

我想写《Java超过C#的地方》这个系列文章,主要是抱着从一个C#程序员的角度,向Java学习的态度,决没有任何吵架的意思。汲取精华,去其糟粕嘛,呵呵。当然,这个系列是不是写的下去,要看看我是否真的碰到了我觉得Java比C#好的地方,碰到了一个我就会记录一篇~~

静态导入

优点

前言就说到这儿,现在进入今儿这篇文章的正题:静态导入(static import)。

先看下面这段示例代码:

  1. public class SayHelloTest{  
  2.         @Test  
  3. public void should_say_hello_when_given_your_name(){  
  4.            gotoPage("hello");  
  5.           input("name","yuyijq");  
  6.          click("sayButton");  
  7. assertThat(helloPage.getLabel(),is("hello yuyijq"));  
  8.     }  

这是一段典型的功能测试代码。对于功能测试来说,关键的就是要模拟用户场景,而不涉及技术细节,用领域的语言来表达出测试。上面的测试用很清晰的步骤表达出了测试的意图,要注意的是这里的gotoPage,input,click以及assertThat方法都不是SayHelloTest类的实例方法,都是定义在别的类甚至是第三方框架中的静态方法。通过Java的静态导入特性,使得现在代码的可读性更高:

  1. import static com.cnblogs.yuyijq.functionalTest.gotoPage; 

弊端

通过静态导入,我们可以去掉类名的前缀,这样就可以将代码写得更自然,更像是在描述一件事儿。但静态导入也并不是没有缺点。在软件开发中,很多特性适当的使用都很好,但是一旦使用过度就有可能变成坏事,这就是那个名言:不要拿着锤子,就把啥都当钉子。请看下面的代码:

  1. map.get(MOST_VIEWED.toString());  
  2. map.get(LAST_VIEWED.toString());  
  3. map.get(IS_LAST_ARTICLE.toString());  
  4. map.get(IS_SHOW_PICTURE.toString());  
  5. //....下面有类似代码若干行  

咋一看还以为这些MOST_VIEWED什么的全部是常量,但***发现这些都是枚举PortalOptions里的项,都是通过静态导入导进来的。但由于没了PortalOptions这个具有说明信息的枚举名作为前缀,丢失了很多信息,造成这段代码不是很容易看懂,不知道map.get出来的到底是什么。代码虽然短了很多,但是如果加上PortalOptions,那么就能很直观的直到我们需要从这个map里获得PortalOptions相关的东东。

在C#里画瓢

好的东西是要学习的,那我们如何在C#里照样画个瓢呢。可惜C#目前还不支持这种静态导入,我也没想到什么好法子能画这个瓢。在C#里不要类名或实例名这个前缀,那除非这个方法是本类的方法,但我们肯定不可能为了使用这样的东东,就给每个类添加这些方法,不过C#里有一个扩展方法特性,我们看看是不是能用扩展方法来画这个瓢:

  1. public static class UnitTestExtensions  
  2.   {  
  3. public static T mock<T>(this object o,Type mockType)  
  4.     {  
  5.     return (T)NMock.Mock(mockType);  
  6.        }  
  7.  }  

由于我们是给object类扩展的方法,所以在所有的类中都可以像是自己的方法一样使用,也就可以写下下面这样的代码了:

  1. public class SayHelloControllerTest  
  2.    {  
  3.        [Test]  
  4. public void should_load_user_when_given_username()  
  5.         {  
  6.         User user = new UserBuilder()  
  7.                .withUserName("yuyijq")  
  8.                 .withAge(80)  
  9.                 .withSex(male)  
  10.                  .build();  
  11.         UserDAO userDAO = mock(typeof(UserDAO));  
  12. when(userDAO.findByUserName("yuyijq")).thenReturn(user);  
  13.     replay(userDAO);  
  14. SayHelloController controller = new SayHelloController(userDAO);  
  15.       verify(userDAO);  
  16. ModelAndView mv = controller.show("yuyijq");  
  17.       assertModelAttribute(mv,"user",user);  
  18.       }  
  19.    } 

不过给object添加扩展方法实在不是一个好主意,污染太大了。目前也没有想出更好的办法,所以就此作罢~~

后语

静态导入就记叙到这里,两个月以来我还是对Java的语法嗤之以鼻,不过对Java社区对开源的采纳程度却是由衷的感叹。

附加说明

我在这里没有任何意思表明Java好于C#,只是我在使用Java过程中发现的一些挺好的地方。这些地方能让我写出我自己觉得更好的代码,而且在我心里C#远超过Java的

地方多得多,这是毋庸置疑的。

原文标题:Java超过C#的地方(一):静态导入

链接:http://www.cnblogs.com/yuyijq/archive/2010/09/15/1827153.html

责任编辑:彭凡 来源: 博客园
相关推荐

2009-08-28 12:41:49

静态方法与非静态方法

2009-08-20 14:28:00

C#静态构造函数

2009-07-31 15:37:45

C#静态构造函数

2009-08-28 14:09:19

C#静态类

2009-07-31 15:44:02

C#静态构造函数

2009-08-28 12:47:30

C#静态方法应用

2009-08-28 12:31:06

C#静态方法

2009-08-28 12:19:19

C#静态方法

2009-08-27 10:44:21

C#静态变量

2009-08-13 18:02:11

C#静态构造函数

2009-08-28 12:25:58

C#静态方法

2009-08-07 13:30:20

C# Excel导入

2009-08-31 09:41:05

C#反射静态方法开发

2009-08-27 16:00:03

C#静态字段C#实例字段

2011-06-11 21:36:44

C#C++

2009-11-17 09:07:55

静态构造函数

2011-06-14 12:27:38

C#C++

2015-09-07 13:55:53

PHPC++

2022-08-22 15:32:59

C++C代码

2009-08-31 10:00:07

C#静态变量
点赞
收藏

51CTO技术栈公众号