Java中有些好的特性(一):静态导入
2012-01-10 01:35
141 查看
首先,请原谅我用了一个很土,很有争议的标题。小弟才思枯竭,实在想不出来什么文雅的了,抱歉~~
前言
换了东家后,从一个死忠c# fans摇身一变,客串了一把java程序员,可能是受老赵的《why java sucks》系列博文影响太大,刚开始那几天有很大的抵触情绪,后来想想,何不乘此机会深入了解一下java。
扮演java程序员两个月以来,受到的折磨比较多,由于以前习惯了微软的饭来张口,衣来伸手的策略,咋角色一转变还真有点不适应,什么都得自己动手。虽然java社区开源项目无数,框架一大把,但可能是选择太多就更迷茫,还是有点不适应。
我想写《java中有些好的特性》这个系列文章,主要是抱着从一个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:
6:input("name","yuyijq");
7:
8:click("saybutton");
9:
10:assertthat(hellopage.getlabel(),is("hello yuyijq"));
11:}
12: }
这是一段典型的功能测试代码。对于功能测试来说,关键的就是要模拟用户场景,而不涉及技术细节,用领域的语言来表达出测试。上面的测试用很清晰的步骤表达出了测试的意图,要注意的是这里的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(this object o,type mocktype)
4:{
5:return (t)nmock.mock(mocktype);
6:}
7:
11:
12:
13: }
由于我们是给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:
18:assertmodelattribute(mv,"user",user);
19:}
20: }
不过给object添加扩展方法实在不是一个好主意,污染太大了。目前也没有想出更好的办法,所以就此作罢~~
后语
静态导入就记叙到这里,两个月以来我还是对java的语法嗤之以鼻,不过对java社区对开源的采纳程度却是由衷的感叹。
附加说明
我在这里没有任何意思表明java好于c#,只是我在使用java过程中发现的一些挺好的地方。这些地方能让我写出我自己觉得更好的代码,而且在我心里c#远超过java的
地方多得多,这是毋庸置疑的。
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定
这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
前言
换了东家后,从一个死忠c# fans摇身一变,客串了一把java程序员,可能是受老赵的《why java sucks》系列博文影响太大,刚开始那几天有很大的抵触情绪,后来想想,何不乘此机会深入了解一下java。
扮演java程序员两个月以来,受到的折磨比较多,由于以前习惯了微软的饭来张口,衣来伸手的策略,咋角色一转变还真有点不适应,什么都得自己动手。虽然java社区开源项目无数,框架一大把,但可能是选择太多就更迷茫,还是有点不适应。
我想写《java中有些好的特性》这个系列文章,主要是抱着从一个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:
6:input("name","yuyijq");
7:
8:click("saybutton");
9:
10:assertthat(hellopage.getlabel(),is("hello yuyijq"));
11:}
12: }
这是一段典型的功能测试代码。对于功能测试来说,关键的就是要模拟用户场景,而不涉及技术细节,用领域的语言来表达出测试。上面的测试用很清晰的步骤表达出了测试的意图,要注意的是这里的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(this object o,type mocktype)
4:{
5:return (t)nmock.mock(mocktype);
6:}
7:
11:
12:
13: }
由于我们是给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:
18:assertmodelattribute(mv,"user",user);
19:}
20: }
不过给object添加扩展方法实在不是一个好主意,污染太大了。目前也没有想出更好的办法,所以就此作罢~~
后语
静态导入就记叙到这里,两个月以来我还是对java的语法嗤之以鼻,不过对java社区对开源的采纳程度却是由衷的感叹。
附加说明
我在这里没有任何意思表明java好于c#,只是我在使用java过程中发现的一些挺好的地方。这些地方能让我写出我自己觉得更好的代码,而且在我心里c#远超过java的
地方多得多,这是毋庸置疑的。
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定
这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
相关文章推荐
- Java中有些好的特性(一):静态导入
- java1.5新特性:可变参数;foreach;静态导入;泛型
- java JDK1.5新特性(一) [静态导入] [可变参数] [增强for] [自动装箱拆箱] [枚举]
- 黑马程序员——Java1.5新特性之享元模式、增强for循环、可变参数、静态导入、自动装箱和拆箱
- JAVA新特性--静态方法导入
- Java JDK5.0的新特性 增强for循环 自动装箱/拆箱 可变参数 静态导入
- java1.5新特性 静态导入 及如何在eclipse中方便使用
- 黑马程序员--张孝祥Java高新技术-JDK1.5新特性(一)【静态导入、可变参数、增强for循环】
- java新特性之静态导入、自动装箱和拆箱、增强for循环、可变参数、枚举
- Java 5新特性(静态导入)
- 黑马程序员------java5的一些简单新特性(静态导入、可变参数、增强for循环、自动拆箱装箱及享元)
- java1.5新特性 静态导入 及如何在eclipse中方便使用
- Java5新特性之静态导入、可变参数、增强for循环、自动拆装箱
- java1.5新特性之一静态导入
- Java5.0新特性01-静态导入(import static)
- 【黑马程序员】java1.5新特性-----可变参数,静态导入,高级for循环及享元设计模式
- Java-JDK5.0的简单新特性(静态导入,可变参数,增强型for循环,自动拆装箱)
- Java基础-----jdk1.5新特性(静态导入,增强for循环,枚举)
- 黑马程序员————java基础--------JDK1.5新特性之泛型、自动拆装箱、增强for、静态导入、可变参数
- 黑马程序员——【Java高新技术】——JDK1.5新特性:静态导入、可变参数、增强型for循环、自动装箱拆箱、枚举