文档章节

Effective Java 学习记录(四)

Java_Coder
 Java_Coder
发布于 2015/01/30 21:20
字数 1197
阅读 25
收藏 0

六十一、抛出与抽象相对应的异常

如果不能阻止或者处理来自更底层的异常,一般的做法是使用异常转译,除非底层方法碰巧可以保证它抛出的异常对高层也合适才可以将异常从底层传播到高层。异常链对于高层和低层异常都提供了最佳的功能:它允许抛出适当的高层异常,同时又能捕获低层异常的原因进行失败分析。

六十二、每个方法抛出的异常都要有文档

为你编写的每个方法所能抛出的异常建立文档,对于未受检和受检的异常,以及对于抽象的和具体的方法也都一样。要为每个受检异常提供单独的throws语句,不要为未受检的异常提供throws子句。如果没有为可以抛出的异常建立文档,其他人根本不可能有效地使用你的类和接口。

六十三、在细节消息中包含能捕获失败的消息

六十四、努力是失败保持原子性

一般而言,作为方法规范的一部分,产生的任何异常都应该在改方法调用之前的状态。

六十五、不要忽略异常

六十六、同步访问共享的数据

当多个线程共享可变数据的时候,每个读或写数据的线程都必须执行同步,如果没有同步,就没法保证一个线程所做的修改可以被另外一个线程获知。

六十七、避免过度使用同步

为了避免死锁和数据破坏,千万不要从同步区域内部调用外来方法。更为一般地讲,要尽量限制同步区域内部的工作量。当你设计一个可变类的时候,要考虑一下他们时候应该自己完成同步操作。

六十八、executor和task优先于线程

六十九、并发工具优先于wait和notify

Java.util.concurrent提供了更多高级的语言特性

七十、线程安全性的文档

没个类都应该利用字酌语酌的说明或者线程安全注解,清楚地在文档中说明它的线程安全的属性。

七十一、慎用延迟初始化

大多数的域应该正常的进行初始化,而不是延迟初始化。如果为了达到性能目标,或者为了破坏有害的初始化循环,二必须延迟初始化一个域,就应该使用相应的延迟初始化方法。

七十二、不要依赖于线程调度器

不要让应用程序的正确性依赖于线程调度器。否则,如果得到的应用程序将既不健壮,也不具有移植性。

七十三、避免使用线程组

线程组并没有提供太多的功能,而且他们 提高的许多功能还是有缺陷的。我们最好把线程组看做是一个不成功的试验,你可以忽略他们,就当他们根本不存在一样。或许你应该使用线程池executor

七十四、谨慎的实现serializable

一旦一个类发布,大大降低“改变这个类的灵活性”的实现; 它增加了出现bug和安全漏洞的可能性; 随着类发行新的版本,相关的测试负担也增加了。

七十五、考虑使用自定的序列化形式

public class TransientDemo implements Serializable{  
    /** 
     *  
     */  
    private static final long serialVersionUID = 1L;  
    private  transient String name;  
    private String password;  
      
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public String getPassword() {  
        return password;  
    }  
  
    public void setPassword(String password) {  
        this.password = password;  
    }  
  
    /**
     * 
     * @param out
     * @throws IOException
     */
    private void writeObject(ObjectOutputStream out) throws IOException{
    	out.defaultWriteObject(); 
    	out.writeObject(this.name);
    }
    
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
    	in.defaultReadObject(); 
    	this.name = (String) in.readObject() + ":::";
    }
    
    /** 
     * @param args 
     * @throws IOException  
     * @throws FileNotFoundException  
     * @throws ClassNotFoundException  
     */  
    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {  
        // TODO Auto-generated method stub  
        String path="D:"+File.separator+"object.txt";  
        File file=new File(path);  
        TransientDemo transientDemo=new TransientDemo();  
        transientDemo.setName("tdd");  
        transientDemo.setPassword("aaa");  
        ObjectOutput output=new ObjectOutputStream(new FileOutputStream(file));  
        output.writeObject(transientDemo);  
        ObjectInput input=new ObjectInputStream(new FileInputStream(file));  
        TransientDemo demo=(TransientDemo )input.readObject();  
        System.out.println(demo.getName()+demo.getPassword());  
    }

七十六、保护性的编写readObject

七十七、对于实例控制,枚举类型优先于readResolve

尽量使用枚举类型来控制势力控制的约束条件。如果做够不到,同时有需要一个即可序列化又是实力受控的类,就必须提供一个readResolve方法,并确保该类的所有实力域都为基本类型,或者是transient的。

七十八、考虑用序列化代替序列画实例

© 著作权归作者所有

Java_Coder
粉丝 60
博文 159
码字总数 102864
作品 0
杭州
私信 提问
Effective Go 中英双语版

Effective Go - 《实效 GO 编程》 Introduction Go is a new language. Although it borrows ideas from existing languages, it has unusual properties that make effective Go programs ......

兵戈天下
2016/08/13
1K
3
Spring Boot MyBatis学习(一)

Spring Boot MyBatis学习(一) 本文仅为记录自己的学习过程,其中很多问题还需要进一步的理解 1.创建Spring Initializr项目 然后点Next、最后点Finsh即可。项目结构如下 二、创建、配置相应...

Azuresky
2018/05/31
18
0
springboot aop 自定义注解方式实现一套完善的日志记录

一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能。 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型(增删改查),详细描述,返回值。 二:项目结构图 如果想...

编程SHA
01/30
514
0
Java各阶段学习书目

1. 入门: 高永强的《Java编程艺术》 2. 提高 Bruce Eckel的《Thinking in Java》 3. 进阶 Joshua Bloch的《Effective Java》 Joshua Bloch的《Java Puzzlers》 4. 全面 Cay S. Horstman的《...

晨曦之光
2012/04/24
159
0
Effective Java 第三版——49. 检查参数有效性

Tips 《Effective Java, Third Edition》一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8...

M104
2018/10/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins World 贡献者峰会及专家答疑展位

本文首发于:Jenkins 中文社区 原文链接 作者:Marky Jackson 译者:shunw Jenkins World 贡献者峰会及专家答疑展位 本文为 Jenkins World 贡献者峰会活动期间的记录 Jenkins 15周岁啦!Jen...

Jenkins中文社区
21分钟前
6
0
杂谈:面向微服务的体系结构评审中需要问的三个问题

面向微服务的体系结构如今风靡全球。这是因为更快的部署节奏和更低的成本是面向微服务的体系结构的基本承诺。 然而,对于大多数试水的公司来说,开发活动更多的是将现有的单块应用程序转换为...

liululee
36分钟前
6
0
OSChina 周二乱弹 —— 我等饭呢,你是不是来错食堂了?

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ 自行车丢了:给主编推荐首歌 《クリスマスの夜》- 岡村孝子 手机党少年们想听歌,请使劲儿戳(这里) @烽火燎原 :国庆快来,我需要长假! ...

小小编辑
今天
355
8
玩转 Springboot 2 之热部署(DevTools)

Devtools 介绍 SpringBoot 提供了热部署的功能,那啥是热部署累?SpringBoot官方是这样说的:只要类路径上的文件发生更改,就会自动重新启动应用程序。在IDE中工作时,这可能是一个有用的功能...

桌前明月
今天
5
0
CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部