1、概念
平台无关性:Java的平台无关性指的就是使用Java编写的程序能够不做任何改变的运行于多个平台。
2、平台无关性的优点
2.1、降低成本
因为平台无关,所以一套程序可运行在各种平台设备上,减少了每个设备上开发一套程序的开发成本;
由于在不同的设备上运行的程序是一样的,降低了维护的复杂度,从而减少维护的时间和成本。
2.2、带来广阔的适用范围
Java最初设计初衷就是为网络设计的,当前越来越多的嵌入式设备接入网络,给Java带来了大量的施展舞台,如嵌入式设备:打印机、扫描仪、传真机等;又如物联网:冰箱、电视、智能家居设备等。
3、如何做到平台无关性
Java对平台无关性的支持,就像对安全性和网络移动性的支持一样,是分布在整个Java体系结构中的,所有的组成部分——语言、class文件、API以及虚拟机,都在对平台无关性的支持扮演着重要角色。
3.1、Java平台
Java程序的平台无关性,主要是通过Java平台。Java平台扮演一个运行时Java程序与其下的硬件和操作系统之间的缓冲。所以Java程序无论被部署到哪,它只需要于Java平台进行交互,而不需要关心底层硬件和操作系统。因此,它能够运行于任何拥有Java平台的计算机。
3.2、Java语言
Java语言定义了基础数据类型的值域和行为,无需关注不同运行环境的不同之处,确保基本数据类型在所有平台上的一致性,为Java程序的平台无关性提供了强有力的支持。
3.3、Java class文件
Java class文件可以在任何平台创建,也可以被任何平台的Java虚拟机装载并执行。它的格式,包括多字节值的高位优先存放约定,都有严格的定义,并且是与Java虚拟机所在平台无关的。
3.4、可伸缩性
Java最初的设计目标之一就是提供某种方式,让软件可以通过网络交付到任意种类的嵌入式设备中(不管它的微处理器和操作系统是什么)。Sun定义了三个基础API集合,它们表现Java平台不同的伸缩性:
企业版(J2EE)
标准版(J2SE)
微型版(J2ME)
4、影响平台无关性因素
当编写Java程序时,平台无关性只是一个可选的性能。Java程序的平台无关程度依赖于多种因素,其中有些因素不在开发人员的控制范围内,但大多数是由开发人员控制的。从根本上说,任何Java程序的平也台无关程度都依赖于作者怎么编写它。
影响Java平台无关性的因素:
4.1、Java平台的部署
只有拥有Java平台的设备才能运行Java程序。设备运行Java程序前,需要具备两个条件,首先对应设备上必须安装了Java平台;其次,对应设备上还必须安装了实现接口。
4.2、Java平台的版本
并非所有的标准运行时库在每个Java平台上都是可用的。作为开发人员,你不可能控制Java平台版本的发布周期或者部署进度表,但是你可以选择自己的程序所依赖的Java平台版本。因此,在实际情况种,当发布一个新的Java平台版本时,你必须自己确定针对新版本编写程序是否合适。
4.3、本地方法
决定Java程序的平台无关程度的另一个主要因素就是你是否调用了本地方法。编写Java程序时,必须遵守的一条最重要的原则就是:不要直接或间接调用不属于Java API的本地方法。如果必须使用本地方法,而且要使程序可以在多种平台上运行,必须将本地方法移植到所有需要的平台上。所以,编写平台独立的Java程序的最初目的是要完全禁止本地方法,并且应该仅通过Java API和主机交互。
4.4、非标准运行时库
Java平台可以由许多开发商来实现,虽然每个开发商必须提供Java API的标准运行时库,但是个别开发商还可能提供了另外的库。如果开发者侧重于平台无关性,那么就必须清楚地知道所使用的那些非标准运行时库是否调用了本地方法。如没有调用本地方法的非标准库不会降低程序的平台无关性。否则,就会产生和直接调用本地方法一样的结果——使得程序和平台相关了。
4.5、对虚拟机的依赖
在编写平台独立的Java程序时,还必须遵从两条原则,这两条原则和Java虚拟机中的某些部分有关,Java虚拟机中的某些部分可以由不同的开发商用不同的方法实现。这两条原则是:
1、不要依赖及时终结(finalization)来达到程序的正确性;
2、不要依赖线程的优先级(thread prioritization)来达到程序的正确性。
这两条原则可以防止Java虚拟机规范中运行的垃圾收集和线程在不同的实现中的变化带来的不利影响。
所有的Java虚拟机都必须有垃圾收集堆,但是不同的实现可能使用不同的垃圾收集技术。在Java虚拟机规范中的这个灵活性意味着,在不同的虚拟机中,一个特定的Java程序中的对象可能在不同的时间被垃圾收集。这也意味着那些在对象被释放前由垃圾收集器运行的终结方法(finalizer),在不同的虚拟机这可能是不同的时间运行的。如果使用了一个终结方法来释放有限的内存资源,例如文件句柄,程序就可能可以在一些虚拟机的实现上运行,而在其它实现上却不能。在一些实现上,程序可能在垃圾收集器得到机会调用释放资源的终结方法之前,就已经将有限的资源耗尽了。
在不同的Java虚拟机的实现中,另一个变化和线程的优先级有关。Java虚拟机规范只保证了,程序中所有拥有最高优先级的可运行线程将会得到一些CPU时间。这个规范也保证了在较高优先级的线程被阻塞时,较低优先级的线程将会运行。但是,在较高优先级的线程没有被阻塞的情况下,并没有禁止较低优先级的线程的运行。在某些虚拟机的实现中,即使较高优先级的线程并未被阻塞,那些较低优先级的线程也可能先得到CPU时间。如果你的程序依赖于这个行为的正确性,它将在某些虚拟机的实现上可以正常运行,而在某些实现上却不能。为了保证多线程Java程序的平台独立,必须依赖同步(sychronization)而不是优先级来在线程之间协调相互间的动作。
4.6、对用户界面的依赖
在不同的Java平台的实现之间 ,另一个主要的变化就是用户的接口。在编写平台独立的Java程序时,用户界面是一个更为困难的问题。用户必须利用这些基础类库建立一个接口,使许多不同平台上的用户使用起来比较舒适,这往往不是一项简单的工作。
虽然AWT和Swing库使得创建运行在不同平台上的用户界面变得比较容易,但是它们并不一定使界面设计变得方便、界面必须使不同平台上的用户使用起来感觉到愉快。
4.7、Java平台实现种的bug
Java平台的不同实现之间还有一个变化就是bug,虽然Sun已经开发了一套全面的测试标准,Java平台实现必须通过这套标准测试。但是可能某些实现在发布的时候仍然包含bug。你只能通过测试来防止这种可能性。如果确实影响,那么就必须试图找到一个绕开的途径。
4.8、测试
Java程序的平台无关性并没有达到只需要在一个平台上测试就可以的程度,所以仍然需要在多个平台上进行测试,以保证程序能达到预期效果。
5、平台无关性的七个步骤
1、选择程序运行设备(宿主机)集合
2、根据设备选择Java开发运行环境
3、给每个宿主机选择运行环境
4、编写程序,只使用Java API的标准运行库来访问计算机(不调用本地方法)
5、编写程序,不依赖垃圾收集器的及时回收释放内存,也不依赖线程的优先级
6、设计一个可以兼容所有宿主机的用户界面
7、在所有宿主机上测试程序
参考书籍:《深入Java虚拟机 第二版》
网友评论