转载自:http://www.cnblogs.com/Y/archive/2011/03/22/JavaVM_Learning_Chapter2_Platform_Independence.html
为什么要平台无关?
废话!当然是方便了,你随手写一个Hello,world!,地球上所有的设备都能显示出来,那多牛B!写hello,world! 你可能觉得没有用,那要是写一句“今年过节不收礼。。。”,钱是不是就开始掉下来了?
Java体系结构对平台(操作系统)无关的支持
这部分是本章中我最觉得有用的,如下:
- Java平台提供平台无关性。把脏活累活留给自己,打掉牙往肚里吞,对外始终保持一个样(小样?)。
- Java语言提供平台无关性。由于不需要针对特定操作系统,Java语言就只针对Java的平台,所以就不会出现大端小端的问题,不会出现int的占位长度问题等等。
- Java的class文件提供平台无关性。就是说,不仅语言提供无关性,把语言扁(编)过以后,还是无关。
- 可 伸缩性。如果把windows、linux、unix、mac等等看做是横向的系统,在这些系统上Java可以提供相同的功能。那么大型机、小型机、微型 机、嵌入式设备就是纵向的,Java通过对自身平台的扩展或者缩减来提供不同规模和功能的系统。相当于windows的桌面平台、服务器平台和嵌入式平台 (Windows CE/Mobile)。
其实,一二三点都是基 于Java平台本身无关带来的,就是从源代码->中间文件->实现功能 这三级都通通统一(拗口吧)。这个思想应该值得我们在设计平台时借鉴,在设计一个业务平台时,考虑分层(类似 实现/功能/中间文件/代码)时,尽量提供可扩展和可伸缩的设计,让后期的功能改变都只影响尽量少的模块(这句话我写是写了,但是感觉有些空,就权当是耳 边风吧,反正又不收钱)。
另外,从第四点中,我倒是稍微搞清楚了不同类型Java平台的作用了。J2EE、J2SE、J2ME分别针对企业应用、桌面应用和移动应用。微软有分移动平台和桌面平台,但是好像没有把企业应用单独分出来。
影响平台无关的因素
这一部分的意思主要就是:其实Java也不是真的就能把所有的系统全部都吃进去,由于有如下因素:
- Java平台的部署。就是指这个系统中是否支持Java。这个真的是废话了,如果不支持,Java平台的本地实现从天上掉下来?
- Java平台的版本。一个是指企业/桌面/移动的不同版本,一个是指平台的版本号变迁。这两个都好理解,前一个是范围的问题,后一个是版本前后兼容的问题。
- 本 地方法。想平台无关,就不要用本地方法。但是一定要用怎么办?一个是就不要追求平台无关了,这个做法是最常见的,用于兼容老的、特定的软硬件系统,或者根 本就没有跨平台的需要。另外一个是在所有的系统中都加上本地方法,把本地方法融入到你自己的Java平台中,让它变成YourJava平台的一部分,当然 了,代价就是你要去做原来Sun/Oracle做的事情。
- 非标准运行时 库。我真是天才,上面一点中我就想到了把自己的方法变成YourJava平台的一部分,这里马上就提到了很多厂商就提供了自己的库。厂商一般需要先提供标 准的Java运行时库,然后提供扩展的功能,提供N多系统对应的CompanyJava平台版本,越是NB的厂商,其功能就越强大,支持的系统就越广泛 (MS例外)。
- 对虚拟机的依赖。finalization和thread prioritization这两个功能可能会因为不同开发商实现的不同导致平台依赖性,所以,不要用这两个特性。这个说法我以前没有接触到,所以理解可能有问题,以后想通了再回来补充一下。
- 对 界面的依赖。这个简单,打开一个软件,你一眼就能发现:这个是windows软件,这个是苹果上面的,这个是Java的,这个是Dos的,不同的操作系统 都有自己的典型界面,用户可能习惯于这个界面,所以理论上,Java软件具有统一界面且不与系统相关,刚开始的时候, 谁都看它不顺眼(因为和谁都不一样呗!)这个貌似现在有做法是做成界面本地系统化,让不同系统上的Java调用该系统对应的界面,以达到欺骗用户双眼和蒙 蔽用户心灵的双重功效。
- Bug。不懂,谁都有Bug,这个影响什么?
- 测试。不测试好所有的系统就无法说全系统平台无关。实际使用中,把能涉及到的系统都测试一下就OK了,不可能做个qq还要求神马也支持。
如何做到平台无关
考虑如下因素:
- 选对象-软件要运行在哪些软硬件系统上?
- 选平台-Java平台和版本,如写手机软件用J2EE,写QQ for iPad用J2SE的win7版本,做网站用J2ME,这些都是找死的做法,千万不要哦。另外,版本号也是非常重要,对于新老系统的兼容性也需要考虑。
- 选运行时-平台规平台,实现归实现,选微软的和IBM的就是不一样的,这个也需要好好考虑,一旦确定后,通常是不好变的,小变可以,大变比较困难。
- 只用改用的-只用标准的,本地的、厂商特有的,通通不用!这个有时候比较难,要不然为什么我选那个厂商呢?
- 不依赖虚拟机-这个我不熟悉,参看上面“影响平台无关的因素”中的第五点。
- 做一个界面-这个我不懂,意思是说,做一个界面,这个界面在所有的系统上都能正常工作,是说不让用特别的控件或实现方式吗?。
- 测试-就是所有系统都测试一下,不要只测试一个,就觉得其它的都没有问题了。看吧,Java也不是真的就只在一个操作系统上搞定,就能搞定所有的了,平台无关还是一个相对的概念。
如果你都做到了,也不一定就行,反正最终是以实际结果为准,如果结果也都OK,你就能用一个咖啡的标记表示纯正的麦斯威尔,不对,是Java。
平台无关性的策略
有 一些厂商提供了Java的运行时库,增加了自己的功能,提供了一些独有的工具,你需要作出选择,到底用谁的。我现在的水平和money观念还顾不上这么 多,搞不好一天换3套平台都是有可能的,一般是听有经验的同事或者上网看看别人的评价(可惜不如淘宝的方便和真实),然后作出一个决定就行了。如果错了怎 么办?凉拌!换一个不就得了。
心得
没有想到这么一章我不是很感兴趣的章节还打了这么多字,我是不是很久没有打字了?
说实话,这一章主要是比较系统性的理顺了我之前对Java的宏观理解,包括企业/桌面/移动的分类,Java是需要在不同系统上专门实现的,企业可以基于Java平台的标准,自己提供实现。还是有收获的,不然真不会写这么多!