`
txidol
  • 浏览: 54886 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

【JAVA陷阱与缺陷-->规则】(三)高级篇

阅读更多

C.1 I/O

C.1.1 Stream.close可以抛出IOException异常

规则:要在close上捕获异常,并且一般做法是忽略这些异常。

C.1.2 PrintStream.write(int)不刷新输出流

规则:要避免使用PrintStream.write(int)。如果用它,需要调用flush。

C.1.3 要消费掉一个进程的输出,否者该进程可能挂起

规则:应该总是消费掉你所创建的进程的输出。

 

C.2 线程

C.2.1 调用Thread.run不能启动一个线程

规则:永远不要调用Thread.run。

C.2.2 库类可能锁住或通知它们的实例

规则:如果你在扩展一个库类,那么请不要使用实例锁。应该使用存储在一个

私有域中的单独的锁对象。

C.2.3 Thread.interrupted会清除中断状态

规则:不要使用Thread.interrupted,除非你想清除当前线程的中断状态。

C.2.4 类初始化过程中将持有该类的锁

规则:要避免死锁风险,永远不要在类初始化过程中等待一个后台线程。[JSL 12.4.2]

C.2.5 在共享可变状态时同步失败,可能导致不能观察状态的变化

规则:要同步对共享的可变状态的访问。[EJ Item 48]

C.2.6 在被同步的语句块中调用外部方法可能导致死锁

规则:永远不要将控制流让给在被同步的方法或语句块中调用的外部方法。[EJ Item 49]

C.2.7 在while循环的外部调用wait方法会引发不可预知的行为

规则:永远不要在一个while循环的外部去调用wait。[EJ Item 50]

C.2.8 对线程调度器的依赖可能导致不定的且平台依赖的行为

规则:为了编写健壮的、响应迅速的和可移植的多线程程序,应该确保在任何给定的时刻,

都只有极少数的线程是可运行的。[EJ Item 51]

 

C.3 反射

C.3.1 反射将检查对实体和实体所属类的访问权限

规则:用反射实例化类,用接口访问实例。

C.3.2 用反射实例化内部类需要一个额外的参数

规则:不要在内部类上使用反射

优先考虑使用静态成员类,而不是内部类

C.3.3 Class.newInstance可以抛出未声明的受检查异常

规则只要存在构造器会抛出受检查异常的任何可能性,那么就应该使用java.lang.reflect.

Constructor.newInstance而不是Class.newInstance

 

C.4 序列化

C.4.1 让一个类可序列化将引入一个公共的伪构造器

规则:在让一个类可序列化前,三思

在接受缺省的readObject方法之前,要三思

编写readObject方法时,要采取保护性措施

C.4.2 序列化形式是类得公共API的一部分

规则:在设计序列化形式时,应该与设计任何其他API一样小心仔细。

C.4.3 使用缺省的序列化形式会在类得公共API中泄露私有域

规则:应该考虑使用某种定制的序列化形式

C.4.4 使用缺省的序列化形式可能会导致性能低下

规则:应该考虑使用某种定制的序列化形式

C.4.5 维护实例控制的不变规则需要一个readResolve方法

规则:应该总是为单例、自编的类型安全的枚举类型以及其他实例控制的

可实例化的类编写一个readResolve方法。

C.4.6 声明序列版本UID失败会导致脆弱

规则:应该在可序列化的类中声明一个显式的序列版本UID。

C.4.7 如果readObject或readResolve调用了可覆写的方法,反序列化循环的对象图可能引发奔溃

规则:如果一个HashSet、HashMap或HashTable将被序列化,那么确保其内容不会返回引用它;

在readObject和readResolve方法中,要避免在当前正在被序列化的对象上调用方法。

如果无法听从建议,那么要确保对象图不会有任何问题的循环。

 

C.5 其他库

C.5.1 覆写equals方法而不覆写hashCode方法可能会引发不定的行为

规则:总是要一起覆写。

C.5.2 Calendar和Date设计得很差劲

规则:一定要参考API。

C.5.3 许多类不管方法名是什么,这些类都是不可变的

规则:不要被误导而认为不可变的类型是可变的。不可变的类型包括

String Integer Long Short Byte Character Boolean Float Double BigInteger BigDecimal

C.5.4 某些被弃用的方法对程序员来说就是毒药

规则:弃用的方法 Thread.stop Thread.suspend Runtime.runFinalizerOnExit System.runFinalizerOnExit

C.5.5 使用自编的解决方案而不是库容易导致努力白费、bug产生以及极差的性能

规则:要了解并使用库。

分享到:
评论

相关推荐

    tomcat跨域请求配置

    首先下载cors-filter-2.5.jar和java-property-utils-1.9.1 1、把这两个jar包放在tomcat的lib下。 2、在conf文件夹下找到web.xml。 3、在web.xml中添加如下代码: <filter> <filter-name>CORS</filter-name> ...

    cors-filter-1.7.jar 和 java-property-utils-1.9.jar

    `java-property-utils-1.9.jar` 可能用于读取自定义的配置文件,例如,你可能希望根据不同的环境设置不同的CORS策略,这时可以将策略写入一个属性文件,然后使用`java-property-utils`来读取并设置过滤器的参数。...

    javacv-platform-1.3-bin.zip

    总的来说,JavaCV 1.3提供了一个跨平台的解决方案,将计算机视觉、音频视频处理的强大功能与Java的易用性相结合,大大降低了开发复杂视觉应用的门槛。通过这个`javacv-platform-1.3-bin.zip`压缩包,你可以快速地在...

    jsp版富文本编辑器fckeditor-java-2.5

    fckeditor-java-core-2.4.jar <servlet> <servlet-name>Connector</servlet-name> <servlet-class>net.fckeditor.connector.ConnectorServlet</servlet-class> <load-on-startup>1</load-on-startup> ...

    javamelody.jar和 jrobin.jar

    监控器需要的jar,需在web.xml中配置<filter> <filter-name>monitoring</filter-name> <filter-class>net.bull.javamelody.MonitoringFilter</filter-class> </filter> <filter-mapping> <filter-name>...

    ssh入门视频之ssh2

    张孝祥java高级-> 张孝祥javascript视频教程-> 俄罗斯方块视频教程-> 贪吃蛇游戏项目实战-> 张孝祥javaweb视频教程-> 张孝祥java邮件开发视频-> 传智播客Struts视频教程-> 传智播客hibernate视频教程-> 传智播客...

    javacv-platform-1.3.3-bin.zip

    javacv官方最新全量jar包,javacv-platform-1.3.3-bin.zip,由于github国内下载较慢,此文件只作为分流,由于现在csdn没办法设置免费资源了,只能设置最低的2分,望大家见谅!

    filter对request请求拦截,对请求参数进行修改

    -- 特殊字符过滤 --> <filter> <filter-name>sqlFilter</filter-name> <filter-class>weixin.idea.waiting.cq.controller.JsFilter</filter-class> </filter> <filter-mapping> <filter-name>sqlFilter...

    Java Web项目集成开源报表工具BIRT

    --报表配置开始 --> <display-name>Eclipse BIRT Report Viewer</display-name> <context-param> <param-name>BIRT_VIEWER_LOCALE</param-name> <param-value>en-US</param-value> </context-param> <context-...

    JMS简明教程创建消息 -> 发送消息 -> 接收消息 -> 读取消息

    -> 创建消息 -> 发送消息 -> 接收消息 -> 读取消息 为什么要使用消息 理由很简单,消息是一个分布式的低耦合通讯方案。A发送一个消息到一个agent ,B作为接受者去agent上获取消息。但是A,B不需要同时到agent上去...

    mysql-connector-java-commercial-5.1.30-bin.jar

    将要使用的是mysql-connector-java-5.1.30-bin-g.jar和mysql-connector-java-5.1.30-bin.jar 配置 在C:\Program Files\Java目录下建立mysqlforjdbc子目录,进入该目录将mysql-connector-java-5.1.30-bin.jar到该...

    mysql-connector-java-5.1.7-bin.jar

    "mysql-connector-java-5.1.7-bin.jar" 文件就是这个桥梁,它是一个Java归档(JAR)文件,包含了MySQL JDBC驱动的所有必要组件。 MySQL JDBC驱动,也被称为MySQL Connector/J,允许Java应用程序通过遵循JDBC API来...

    aliyun-java-sdk-dysmsapi-1.0.0

    <artifactId>aliyun-java-sdk-core</artifactId> <version>3.2.2</version> </dependency> 如此引用即可,更多关于阿里云短信发送相关请参考http://blog.csdn.net/niaoer2010/article/details/78036664

    java源码包---java 源码 大量 实例

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    mysql-connector-java-5.1.40-bin.jar连接器

    在这个特定的版本——mysql-connector-java-5.1.40-bin.jar中,我们找到了这个连接器的5.1系列的一个稳定版本。 首先,让我们了解JDBC的作用。JDBC是Sun Microsystems(现为Oracle公司)为Java编程语言设计的一套...

    java-property-utils-1.9.jar

    配置tomcat,支持js跨域访问用的的jar包 与 cors-filter-1.8.jar 一起用

    android-4.4源码

    eclipse关联源码 步骤一:把该源码下载下来 步骤2:找到你安装sdk的...步骤四:找到项目android.jar, 然后---》properties-->java source attachment--->点External Folder 找到 刚才新建的sources目录即可 最后重启!

    mysql-connector-java-5.1.42-bin.jar 官网驱动下载

    mysql-connector-java-5.1.42-bin.jar 官网下载的驱动

    mysql-connector-java-5.1.45-bin.jar

    MySQL Connector/J是MySQL数据库官方提供的Java...总的来说,"mysql-connector-java-5.1.45-bin.jar"是一个关键组件,用于Java应用程序与MySQL数据库的交互,它的正确使用和配置对于开发基于Java的数据库应用至关重要。

    taobao-sdk-java-auto源码

    阿里云的taobao-sdk-java-auto.jar及源码, 感兴趣的朋友可以下载一下。。。。。。。

Global site tag (gtag.js) - Google Analytics