天天看點

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/