天天看点

Java中有些好的特性(一):静态导入

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

  前言

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

  静态导入

  优点

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

  先看下面这段示例代码:

1: public class SayHelloTest{

2:     @Test

3:     public void should_say_hello_when_given_your_name(){

4:         gotoPage("hello");

5:

6:         input("name","yuyijq");

7:

8:         click("sayButton");

9:

10:         assertThat(helloPage.getLabel(),is("hello yuyijq"));

11:     }

12: }

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#里画瓢

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:     }

11:

12:

13: }

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

1: public class SayHelloControllerTest

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:

18:         assertModelAttribute(mv,"user",user);

19:     }

20: }

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

  后语

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

  附加说明

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

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

本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/