Welcome 微信登录

首页 / 软件开发 / JAVA

实现双重派遣

实现双重派遣

实现双重派遣2007-05-29 yycnet.yeah.net yyc译记住多形性只能通过方法调用才能表现出来,所以假如想使双重派遣正确进行,必须执行两个方法调用:在每种结构中都用一个来判断其中的类型。在Trash结构中,将使用一个新的方法调用addToBin(),它采用的参数是由TypeBin构成的一个数组。那个方法将在数组中遍历,尝试将自己加入适当的垃圾筒,这里正是双重派遣发生的地方。新建立的分级结构是TypeBin,其中包含了它自己的一个方法,名为...
访问器范式

访问器范式

访问器范式2007-05-29 yycnet.yeah.net yyc译接下来,让我们思考如何将具有完全不同目标的一个设计范式应用到垃圾归类系统。对这个范式,我们不再关心在系统中加入新型Trash时的优化。事实上,这个范式使新型Trash的添加显得更加复杂。假定我们有一个基本类结构,它是固定不变的;它或许来自另一个开发者或公司,我们无权对那个结构进行任何修改。然而,我们又希望在那个结构里加入新的多形性方法。这意味着我们一般必须在基础类的接口里添加某些东西。...
RTTI有害吗

RTTI有害吗

RTTI有害吗2007-05-29 yycnet.yeah.net yyc译本章的各种设计方案都在努力避免使用RTTI,这或许会给大家留下“RTTI有害”的印象(还记得可怜的goto吗,由于给人印象不佳,根本就没有放到Java里来)。但实际情况并非绝对如此。正确地说,应该是RTTI使用不当才“有害”。我们之所以想避免RTTI的使用,是由于它的错误运用会造成扩展性受到损害。而我们事前提出的目标就是能向系统自由加...
设计范式学习总结

设计范式学习总结

设计范式学习总结2007-05-29 yycnet.yeah.net yyc译从表面看,由于象TrashVisitor.java这样的设计包含了比早期设计数量更多的代码,所以会留下效率不高的印象。试图用各种设计方案达到什么目的应该是我们考虑的重点。设计范式特别适合“将发生变化的东西与保持不变的东西隔离开”。而“发生变化的东西”可以代表许多种变化。之所以发生变化,可能是由于程序进入一个新环境,或者由于当前环境的...
java文字处理

java文字处理

java文字处理2007-05-29 yycnet.yeah.net yyc译如果您有C或C++的经验,那么最开始可能会对Java控制文本的能力感到怀疑。事实上,我们最害怕的就是速度特别慢,这可能妨碍我们创造能力的发挥。然而,Java对应的工具(特别是String类)具有很强的功能,就象本节的例子展示的那样(而且性能也有一定程度的提升)。正如大家即将看到的那样,建立这些例子的目的都是为了解决本书编制过程中遇到的一些问题。但是,它们的能力并非仅止于此。通过简...
提取代码列表

提取代码列表

提取代码列表2007-05-29 yycnet.yeah.net yyc译对于本书每一个完整的代码列表(不是代码段),大家无疑会注意到它们都用特殊的注释记号起始与结束("//:"和"///:~")。之所以要包括这种标志信息,是为了能将代码从本书自动提取到兼容的源码文件中。在我的前一本书里,我设计了一个系统,可将测试过的代码文件自动合并到书中。但对于这本书,我发现一种更简便的做法是一旦通过了最初的测试,就把代码粘贴到书中。而且由于很难第一次就编译通过,所以我...
检查大小写样式

检查大小写样式

检查大小写样式2007-05-29 yycnet.yeah.net yyc译尽管对涉及文字处理的一些项目来说,前例显得比较方便,但下面要介绍的项目却能立即发挥作用,因为它执行的是一个样式检查,以确保我们的大小写形式符合“事实上”的Java样式标准。它会在当前目录中打开每个.java文件,并提取出所有类名以及标识符。若发现有不符合Java样式的情况,就向我们提出报告。为了让这个程序正确运行,首先必须构建一个类名,将它作为一个&ldqu...
方法查找工具

方法查找工具

方法查找工具2007-05-29 yycnet.yeah.net yyc译第11章介绍了Java 1.1新的“反射”概念,并利用这个概念查询一个特定类的方法——要么是由所有方法构成的一个完整列表,要么是这个列表的一个子集(名字与我们指定的关键字相符)。那个例子最大的好处就是能自动显示出所有方法,不强迫我们在继承结构中遍历,检查每一级的基础类。所以,它实际是我们节省编程时间的一个有效工具:因为大多数Java方法...
复杂性理论

复杂性理论

复杂性理论2007-05-29 yycnet.yeah.net yyc译下面要介绍的程序的前身是由Larry O"Brien原创的一些代码,并以由Craig Reynolds于1986年编制的“Boids”程序为基础,当时是为了演示复杂性理论的一个特殊问题,名为“凸显”(Emergence)。这儿要达到的目标是通过为每种动物都规定少许简单的规则,从而逼真地再现动物的群聚行为。每个动物都能看到看到整个环境以及环...
使用非Java代码

使用非Java代码

使用非Java代码2007-05-29 yycnet.yeah.net yyc译JAVA语言及其标准API(应用程序编程接口)应付应用程序的编写已绰绰有余。但在某些情况下,还是必须使用非JAVA编码。例如,我们有时要访问操作系统的专用特性,与特殊的硬件设备打交道,重复使用现有的非Java接口,或者要使用“对时间敏感”的代码段,等等。与非Java代码的沟通要求获得编译器和“虚拟机”的专门支持,并需附加的工具将J...
访问JNI函数:JNIEnv自变量

访问JNI函数:JNIEnv自变量

访问JNI函数:JNIEnv自变量2007-05-29 yycnet.yeah.net yyc译利用JNI函数,程序员可从一个固有方法的内部与JVM打交道。正如大家在前面的例子中看到的那样,每个JNI固有方法都会接收一个特殊的自变量作为自己的第一个参数:JNIEnv自变量——它是指向类型为JNIEnv_的一个特殊JNI数据结构的指针。JNI数据结构的一个元素是指向由JVM生成的一个数组的指针;该数组的每个元素都是指向一个JNI函数的...
传递和使用Java对象

传递和使用Java对象

传递和使用Java对象2007-05-29 yycnet.yeah.net yyc译在前例中,我们将一个字串传递给固有方法。事实上,亦可将自己创建的Java对象传递给固有方法。在我们的固有方法内部,可访问已收到的那些对象的字段及方法。为传递对象,声明固有方法时要采用原始的Java语法。如下例所示,MyJavaClass有一个public(公共)字段,以及一个public方法。UseObjects类声明了一个固有方法,用于接收MyJavaClass类的一个对...
JNI和Java违例

JNI和Java违例

JNI和Java违例2007-05-29 yycnet.yeah.net yyc译利用JNI,可丢弃、捕捉、打印以及重新丢弃Java异常,就象在一个Java程序里那样。但对程序员来说,需自行调用专用的JNI函数,以便对异常进行处理。下面列出用于异常处理的一些JNI函数:■Throw():丢弃一个现有的异常对象;在固有方法中用于重新丢弃一个异常。■ThrowNew():生成一个新的异常对象,并将其丢弃。■ExceptionOccurred():判断一个异常是...
JNI和线程处理

JNI和线程处理

JNI和线程处理2007-05-29 yycnet.yeah.net yyc译由于Java是一种多线程语言,几个线程可能同时发出对一个固有方法的调用(若另一个线程发出调用,固有方法可能在运行期间暂停)。此时,完全要由程序员来保证固有调用在多线程的环境中安全进行。例如,要防范用一种未进行监视的方法修改共享数据。此时,我们主要有两个选择:将固有方法声明为“同步”,或在固有方法内部采取其他某些策略,确保数据处理正确地并发进行。此外,绝对不...
使用现成代码

使用现成代码

使用现成代码2007-05-29 yycnet.yeah.net yyc译为实现JNI固有方法,最简单的方法就是在一个Java类里编写固有方法的原型,编译那个类,再通过javah运行.class文件。但假若我们已有一个大型的、早已存在的代码库,而且想从Java里调用它们,此时又该如何是好呢?不可将DLL中的所有函数更名,使其符合JNI命名规则,这种方案是不可行的。最好的方法是在原来的代码库“外面”写一个封装DLL。Java代码会调用...
微软的解决方案

微软的解决方案

微软的解决方案2007-05-29 yycnet.yeah.net yyc译到本书完稿时为止,微软仍未提供对JNI的支持,只是用自己的专利方法提供了对非Java代码调用的支持。这一支持内建到编译器Microsoft JVM以及外部工具中。只有程序用Microsoft Java编译器编译,而且只有在Microsoft Java虚拟机(JVM)上运行的时候,本节讲述的特性才会有效。若计划在因特网上发行自己的应用,或者本单位的内联网建立在不同平台的基础上,就可能...
J/Direct

J/Direct

J/Direct2007-05-29 yycnet.yeah.net yyc译J/Direct是调用Win32 DLL函数最简单的方式。它的主要设计目标是与Win32API打交道,但完全可用它调用其他任何API。但是,尽管这一特性非常方便,但它同时也造成了某些限制,且降低了性能(与RNI相比)。但J/Direct也有一些明显的优点。首先,除希望调用的那个DLL里的代码之外,没有必要再编写额外的非Java代码,换言之,我们不需要一个封装器或者代理/存根DLL...
@dll.import引导命令

@dll.import引导命令

@dll.import引导命令2007-05-29 yycnet.yeah.net yyc译作为使用J/Direct唯一的途径,@dll.import引导命令相当灵活。它提供了为数众多的修改符,可用它们自定义同非Java代码建立链接关系的方式。它亦可应用于类内的一些方法,或应用于整个类。也就是说,我们在那个类内声明的所有方法都是在相同的DLL里实现的。下面让我们具体研究一下这些特性。1. 别名处理和按顺序链接为了使@dll.import引导命令能象上面显示...
<< 21 22 23 24 25 26 27 28 29 30 >>