- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JAVA高效编程指南
创建和销毁对象
考虑用静态工厂方法替代构造函数
如:
public static Boolean valueOf(boolean b){
return (b?Boolean.TRUE:Boolean.False);
}
优势:
它们具有自己的名字
不需要在每次调用时都去创建一个新的对象
可以返回任何子类型的对象
使用私有构造函数强化singleton属性
singleton类就是一种只能被实例化一次的简单类。这种类型典型地被用来表示那些本性上具有唯一特性的系统组件,如:JNDI的name查找器。
具体例子参见:com.zte.resmaster.helpers.NamingHelper
用私有构造函数强化不可实例化能力
有些工具类不希望被实例化:对它进行实例化没有意义。如:java.lang.Math。然而在类中缺少显式构造函数的时候,编译器会自动地提供一个公共的无参数的缺省构造函数。在类中包含显式的私有类型构造函数来实现类的不可实例化特性。因为构造函数是私有的,所以它在类的外部不可访问。如果构造函数不会被类自身从内部调用,即能保证类永远不会被实例化。
避免创建重复对象
String s= new String(guojun);//永远不要这么干!
Strong s = guojun;//可以接受的改进
消除对过期对象的引用
一旦一个对象的引用被不小心地保留,不仅这个对象被排除在垃圾回收之外。而且所有被这个对象引用的对象也不会被垃圾收集,并顺延下去。
一旦对象过期,清除资源以及对它们的引用。尤其自己的程序管理某些对象时,尤其如此。如类中使用对象数组,HashMap 等等。
对象定义
重载equals时要遵守的约定
满足下面的条件就不要重载:
每个类实例本质上是唯一的
不关心类是否提供了“逻辑意义的等同“测试
超类已经重载了equals,而超类继承的行为适合该类
类是私有的或是或是包内私有的,而且可以确定它的equals方法永远不会被调用。
当类有逻辑上的等同意义而不仅仅是对象意义上的等同,而且超类没有重载equals方法以实现期望的行为,这时需要重载。这种情形通常是数值类型的类(Value Object))))))))…)“aaa” + “bbb”;
上面的语句实际上创建了三个String对象,性能受损。
StringBuffer s= new StringBuffer();
s.append(“aaa”);
s.append(“bbb”);
上面仅仅创建一个对象。
通过接口访问对象
如果存在合适的接口类型,那么参数、返回值、变量和域应该用接口类型声明。
如果没有合适的接口,那么通过类而不是接口访问对象,是完全合适的。
接口优于反射
失去在编译期间进行类型检查提供的好处。
代码笨拙而冗长。
性能损失。反射比正常的方法调用慢40倍左右(JDK1.3)。
有的时候,付出代价是值得的,因为能够得到更多的益处;一般而言,可以通过反射创建一个实例,然后通过他们的接口或是超类正常访问他们。
例如:DAO的Factory设计模式中的通过配置实现数据库实现类的平滑移植。
谨慎地使用固有方法
Java Native Interface。不要因为性能这么做,在JDK1.3中Java地速度已经大幅提高,在JDK1.4提高得更多,几乎已经达到了C++的水平。如果你使用JDK1.3以下的版本,你会发现很多方法都是C或是C++实现的。如:BigInteger。但是在JDK1.3中它已经通过Java重新改写了。
当然,你可以使用JNI,但是记住,必须使用有严格保证的代码,如:SUN提交的代码。因为不小心的C/C++的指针操作,会引起JVM崩溃。
如:你可以使用SUN提供的操纵COM(串口/并口)…
为你的系统定义一个统一的异常,系统中的其他异常都继承该异常。
串行化
为了分布式应用中能够传递对象,你可能使用串行化。
一般而言,你不需要做其他事情,除了实现java.io.Serializable接口。如果要通过RMI-IIOP远程传递,那么必须实现该接口。否则,会报告解析错。
每一个可串行化的类都要与一个唯一的标识符关联,如果没有显示声明一个private static final long 的serialVersionUID,那么系统会通过一个复杂的计算过程为类自动生成一个唯一的标识符。
任何对类名、实现的接口名称、公共的或是受保护的成员或是函数名称的改变都将自动产生一个新的UID。
新类和旧类的UID不一致时,你的分布式应用就会失败。
可以采用“serialver.exe -show”能够为类产生一个UID。
避免内存泄漏
由于Java中
文档评论(0)