一、为什么要平台独立
Java是一门为了网络环境而开发的语言,这要求Java程序的二进制形式可以在多种不同的平台上无差别的执行。
在开发者这一边,是用Java开发就可以获得平台独立性,这使自己的软件多了很多潜在的客户。
二、Java体系对Java平台独立性的支持
1、Java平台(The Java Platform)
2、Java语言
3、Class文件
4、可伸缩性
为了实现这种目标,Java平台必须能够紧凑的实现在那种嵌入式设备上,比如那些只有很小可寻址内存,没有硬盘,没有显示设备的机器环境。为此,Java 平台有一些针对特殊嵌入式设备的实现,比如:the Java Embedded Platform、the Java Personal Platform、the Java Card Platform。在这种环境下往往只现实Java平台的子集。
但是这种实现并不限制在个人电脑(personal computers)、工作站(workstations)、大型主机(mainframes)上Java平台的实现。
三、影响平台独立的因素
1、Java平台的配置
2、Java平台的不同版本和不同版本号(The Java Platform Version and Edition)
同一Java平台的各个版本之间也没有实现兼容,为了更好得提供服务,Java平台的发展过程中,不停的会有一些API被删除和添加,这导致Java的各个平台之间不能够兼容。
3、本地方法
但是,当你不考虑平台独立时,使用本地方法还是可行的。一般来说在三种情况下应该直接调用本地方法:
1)、当需要访问Java API无法访问的底层系统资源时;
2)、当要重用遗留系统中的非Java库时;
3)、为了提升系统的执行速度,本地化一些核心代码时。
如果你又想使用本地化代码,又想实现平台独立性时,就必须手工在多个平台上实现本地化代码。
4、非标准类库
5、Java虚拟机的相关性
1)、不要依赖于Java的finalization方法来实现强制垃圾收集;
2)、不要依赖于Java的线程优先级来实现程序的同步。
所有Java虚拟机必须好有垃圾收集堆,但是Java虚拟机的不同实现能够使用不同的垃圾收集技术。这种柔韧性使得不同的Java虚拟机意味着一个 Java程序中的对象可能会在不同被“垃圾收集”。垃圾收集实现的不同关键就是finalizers方法,这个在对象被垃圾收集之前调用的方法。这个方法 可能会被不同Java虚拟机的实现在不同的地方调用。如果你使用finalizers方法来释放资源,可能在一些Java虚拟机的实现被正常调用,而在另 一些可能会在垃圾收集之前用完所有的资源。
另一个可能变化的就是Java的线程优先级。Java虚拟机必须实现所有有高优先级的线程能够获得一些CPU时间,但也必须保证那些低优先级的线程必须在 高优先级的线程堵塞时能够运行。但是这些并没有阻止低优先级的线程在高优先级线程没有堵塞时运行。这意味着即使高优先级的线程没有被堵塞,低优先级的线程 也会获得CPU时间。如果你使用线程优先级来实现协调线程同步,可能在一些虚拟机上能够正常运行而在其他的虚拟机上可能不能正常执行。为了保证Java的 多线程程序能够实现平台独立性,你必须使用同步(synchronization)而不是线程优先级来协调线程。
6、用户界面的相关性
7、Java平台实现中的bug
8、测试
四、平台独立的七个步骤
1、选择一些想要发布程序的目标机器(target hosts)
2、选择一个你认为适合你所发布用的Java平台,并在这个平台上开发、执行你的程序
3、为每个目标机器选择一些你的程序可能会被发布到的Java平台(target runtimes)
4、通过标准运行库的Java API来访问本地资源,不要通过本地方法或者使用本地方法的第三方运行库。
5、不要让你的程序依赖于Java平台垃圾收集及时调用finalization方法,不要依赖于Java的线程优先级来协调多线程。
6、设计一个所有能在目标机器上能够正常工作的用户界面
7、在所有的可能运行平台和机器上测试你的程序
如果你愿意,你可以让你的程序成为纯正的Java程序(100% Pure Java)。你可以通过运行Sun免费提供的认证工具(100% Pure verification tools)来完成认证。这个程序可以让你不运行自己的程序来判断程序的“纯正度”。如果你通过了认证,你就可以使用Sun的纯正Java图标(100% Pure Java coffee cup icon)。
但是通过认证,并不意味你的程序已经完全实现了平台独立性,这个认证只是判断你的程序是否仅仅依赖于Java核心类库。但是,在你实现平台独立性的过程中,执行这个认证还是值得的。
五、平台独立的策略
Java平台的供应商可以提供自己的Java平台的扩展,这些扩展可能是依赖于特定平台的,但是所有的Java平台的实现必须实现Java的核心组件。如 果你只使用核心组件来实现你的程序,你就可能让你的程序“run anywhere”,但是你必定受到最小公约数问题(lowest-common-denominator problem)的苦恼。但是如果你使用了特定Java平台扩展的类库,你就可能最大限度的使用本地环境的优势。那一种更适合,就需要开发者自己去抉择。