一、平台无关性的支持
1、 Java平台
Java平台屏蔽了所有底层与硬件、操作系统的交互实现,java程序只需要知道java平台提
供的API,但如果程序中调用本地方法就无法保证平台无关性。
2、 java语言
java编程语言主要通过对基本的数据类型的值域和行为都由语言定义,而跟具体的操作系统
无关。但在c或者c++中,像int型的值域是由它的占位宽度决定,二占位宽度又依赖于
编译器所在的平台,但java就规定int都是32为二进制补码标识的有符号证书,float则总
是遵收IEEE754浮点标准的32位浮点数。
3、 class 文件
Java class文件可以在任何平台创建,它也可以被任意平台的Java虚拟机装入并运行,它的
格式都有严格的规定,并且是与java虚拟机所在的目标平台无关。
4、 可伸缩性
Java提供了3套API:
企业版(J2EE)
标准版(J2SE)
微型版(J2ME)
在高端,企业版的存在表明了Java平台的高端服务的可用性。在终端,标准版提供了在浏
览器中启动传统applet的功能和桌面环境下的Java平台。在低端,微型版通过不同的行业
子集,显示了Java平台可以向下伸缩。
二、影响平台无关性的因素
1、 Java平台的部署:
决定java平台无关性的最主要的因素就是Java平台的不同平台上被部署的程度。
2、 Java平台的版本
Sun定义了企业版、标准版、微型版,在决定平台无关性时需要考虑程序中使用了那一部分
的API,来决定应该部署java平台的哪个版本。同时尽管虚拟机变化缓慢,但是Java API
是时刻变化着的,有些API特性随着时间的推移可能已经不被支持,虽然大部分都是向
上兼容的,但不是绝对。所以在发布版本的时候还需要决定哪个java版本适合自己的应用。
3、 本地方法
如果为了性能或者系统某些特性javaapi没有提供实现等情况,调用了本地方法,那么应用
本身就不具备平台无关的特性。
4、 非标准运行时库
Java平台可以有很多开发商来实现,都有可能提供另外的扩展库,如果这些库调用了本地方
法,而程序中又使用到了这些库,也将失去平台无关的特性。
5、 对虚拟机的依赖
以下两条与虚拟机实现有关的原则在平台无关性方面是必须遵守的:
(1) 不要依赖及时中介(finilization)来达到程序的正确性;
因为所有的java虚拟机都必须有垃圾收集堆,但是不同的实现可能使用不同的垃圾收集技
术。在Java虚拟机规范中的这个灵活性意味着,在不同的虚拟机中,一个特定的java程序
中的对象可能在不同的时间被垃圾回收。如果使用了一个中介方法来释放有限的内存资源
等,程序就可能可以在一些虚拟机的实现上运行,而在其他实现上不能运行,因为有可能在
垃圾收集器调用释放资源之前,资源已经耗尽。
(2) 不要依赖线程的优先级来达到程序的正确性。
Java虚拟机规范只保证了在程序中所有拥有高优先级的可运行线程可以得到一些CPU时
间,在高优先级被阻塞的情况下,低优先级的线程也会运行。但是,在较高优先级的线程
没有被阻塞的情况下,并没有禁止低优先级的线程运行。因此,在一些虚拟机实现中就
可能出现较高优先级的进程在没有被阻塞的情况下,低优先级的线程也可以得到CPU时间。
因此为了保证多线程Java程序的平台独立,必须历来同步而不是优先级来在线程之间协调
相互间的动作
6、 对用户界面的依赖
AWT和Swing组建只保证了在平台上用户界面创建的容易性,但它们不一定使用户界面设
计方便。
7、 Java平台的BUG
虽然Sun开发了一套全面的测试标准,但也无法避免平台实现的BUG,因此你只能通过测试来避免BUG,如果BUG影响到程序的运行,就应该想办法绕过此BUG,找寻其他途径。
8、 测试
因为java平台的实现之间可能存在差异,依赖某些特定平台些的程序,以及在任何特定的
Java平台的实现中都存在BUG,所以应该尽可能在在所有希望运行的平台上对java程序
进行测试,就好比web前端开发人员要对所有IE、firefox、chrom、opera等做浏览器兼容
测试一样。
三、平台无关的7个步骤
1、选择程序要运行的主机和设备的集合
2、在目标宿主机中选择自认为足够好的Java平台版本,在该平台版本上编写、运行程序
3、对于每个宿主机,选择一些程序将要运行的java平台实现(目标运行时环境)。
4、程序只访问Java API的标准运行库
5、不依赖于垃圾回收器和线程优先级来达到程序正确性目的
6、努力设计一个用户界面,是它在所有目标宿主机上能正确运行
7、在所有的目标运行时环境和宿主机上进行程序测试