C#不如Java的地方:靜態(tài)導(dǎo)入
首先,請(qǐng)?jiān)徫矣昧艘粋€(gè)很土,很有爭(zhēng)議的標(biāo)題。小弟才思枯竭,實(shí)在想不出來(lái)什么文雅的了,抱歉~~
前言
換了東家后,從一個(gè)死忠C# Fans搖身一變,客串了一把Java程序員,可能是受老趙的《Why Java Sucks》系列博文影響太大,剛開(kāi)始那幾天有很大的抵觸情緒,后來(lái)想想,何不乘此機(jī)會(huì)深入了解一下Java。
扮演Java程序員兩個(gè)月以來(lái),受到的折磨比較多,由于以前習(xí)慣了微軟的飯來(lái)張口,衣來(lái)伸手的策略,咋角色一轉(zhuǎn)變還真有點(diǎn)不適應(yīng),什么都得自己動(dòng)手。雖然Java社區(qū)開(kāi)源項(xiàng)目無(wú)數(shù),框架一大把,但可能是選擇太多就更迷茫,還是有點(diǎn)不適應(yīng)。
我想寫(xiě)《Java超過(guò)C#的地方》這個(gè)系列文章,主要是抱著從一個(gè)C#程序員的角度,向Java學(xué)習(xí)的態(tài)度,決沒(méi)有任何吵架的意思。汲取精華,去其糟粕嘛,呵呵。當(dāng)然,這個(gè)系列是不是寫(xiě)的下去,要看看我是否真的碰到了我覺(jué)得Java比C#好的地方,碰到了一個(gè)我就會(huì)記錄一篇~~
靜態(tài)導(dǎo)入
優(yōu)點(diǎn)
前言就說(shuō)到這兒,現(xiàn)在進(jìn)入今兒這篇文章的正題:靜態(tài)導(dǎo)入(static import)。
先看下面這段示例代碼:
- public class SayHelloTest{
- @Test
- public void should_say_hello_when_given_your_name(){
- gotoPage("hello");
- input("name","yuyijq");
- click("sayButton");
- assertThat(helloPage.getLabel(),is("hello yuyijq"));
- }
- }
這是一段典型的功能測(cè)試代碼。對(duì)于功能測(cè)試來(lái)說(shuō),關(guān)鍵的就是要模擬用戶場(chǎng)景,而不涉及技術(shù)細(xì)節(jié),用領(lǐng)域的語(yǔ)言來(lái)表達(dá)出測(cè)試。上面的測(cè)試用很清晰的步驟表達(dá)出了測(cè)試的意圖,要注意的是這里的gotoPage,input,click以及assertThat方法都不是SayHelloTest類的實(shí)例方法,都是定義在別的類甚至是第三方框架中的靜態(tài)方法。通過(guò)Java的靜態(tài)導(dǎo)入特性,使得現(xiàn)在代碼的可讀性更高:
- import static com.cnblogs.yuyijq.functionalTest.gotoPage;
弊端
通過(guò)靜態(tài)導(dǎo)入,我們可以去掉類名的前綴,這樣就可以將代碼寫(xiě)得更自然,更像是在描述一件事兒。但靜態(tài)導(dǎo)入也并不是沒(méi)有缺點(diǎn)。在軟件開(kāi)發(fā)中,很多特性適當(dāng)?shù)氖褂枚己芎茫且坏┦褂眠^(guò)度就有可能變成壞事,這就是那個(gè)名言:不要拿著錘子,就把啥都當(dāng)釘子。請(qǐng)看下面的代碼:
- map.get(MOST_VIEWED.toString());
- map.get(LAST_VIEWED.toString());
- map.get(IS_LAST_ARTICLE.toString());
- map.get(IS_SHOW_PICTURE.toString());
- //....下面有類似代碼若干行
咋一看還以為這些MOST_VIEWED什么的全部是常量,但***發(fā)現(xiàn)這些都是枚舉PortalOptions里的項(xiàng),都是通過(guò)靜態(tài)導(dǎo)入導(dǎo)進(jìn)來(lái)的。但由于沒(méi)了PortalOptions這個(gè)具有說(shuō)明信息的枚舉名作為前綴,丟失了很多信息,造成這段代碼不是很容易看懂,不知道m(xù)ap.get出來(lái)的到底是什么。代碼雖然短了很多,但是如果加上PortalOptions,那么就能很直觀的直到我們需要從這個(gè)map里獲得PortalOptions相關(guān)的東東。
在C#里畫(huà)瓢
好的東西是要學(xué)習(xí)的,那我們?nèi)绾卧贑#里照樣畫(huà)個(gè)瓢呢。可惜C#目前還不支持這種靜態(tài)導(dǎo)入,我也沒(méi)想到什么好法子能畫(huà)這個(gè)瓢。在C#里不要類名或?qū)嵗@個(gè)前綴,那除非這個(gè)方法是本類的方法,但我們肯定不可能為了使用這樣的東東,就給每個(gè)類添加這些方法,不過(guò)C#里有一個(gè)擴(kuò)展方法特性,我們看看是不是能用擴(kuò)展方法來(lái)畫(huà)這個(gè)瓢:
- public static class UnitTestExtensions
- {
- public static T mock<T>(this object o,Type mockType)
- {
- return (T)NMock.Mock(mockType);
- }
- }
由于我們是給object類擴(kuò)展的方法,所以在所有的類中都可以像是自己的方法一樣使用,也就可以寫(xiě)下下面這樣的代碼了:
- public class SayHelloControllerTest
- {
- [Test]
- public void should_load_user_when_given_username()
- {
- User user = new UserBuilder()
- .withUserName("yuyijq")
- .withAge(80)
- .withSex(male)
- .build();
- UserDAO userDAO = mock(typeof(UserDAO));
- when(userDAO.findByUserName("yuyijq")).thenReturn(user);
- replay(userDAO);
- SayHelloController controller = new SayHelloController(userDAO);
- verify(userDAO);
- ModelAndView mv = controller.show("yuyijq");
- assertModelAttribute(mv,"user",user);
- }
- }
不過(guò)給object添加擴(kuò)展方法實(shí)在不是一個(gè)好主意,污染太大了。目前也沒(méi)有想出更好的辦法,所以就此作罷~~
后語(yǔ)
靜態(tài)導(dǎo)入就記敘到這里,兩個(gè)月以來(lái)我還是對(duì)Java的語(yǔ)法嗤之以鼻,不過(guò)對(duì)Java社區(qū)對(duì)開(kāi)源的采納程度卻是由衷的感嘆。
附加說(shuō)明
我在這里沒(méi)有任何意思表明Java好于C#,只是我在使用Java過(guò)程中發(fā)現(xiàn)的一些挺好的地方。這些地方能讓我寫(xiě)出我自己覺(jué)得更好的代碼,而且在我心里C#遠(yuǎn)超過(guò)Java的
地方多得多,這是毋庸置疑的。
原文標(biāo)題:Java超過(guò)C#的地方(一):靜態(tài)導(dǎo)入
鏈接:http://www.cnblogs.com/yuyijq/archive/2010/09/15/1827153.html


















