保持最小的可变性
说一个类"不变",就是说它的所有对象在运行时不可以被更改。Java系统库中有很多这样的例子,比如String、类封装的基本数据类型、BigInteger和BigDecimal等等。想创建一个不变类,需要遵循下面5条原则:
1. 不能提供任何改变对象状态的方法(比如setter)。
2. 保证类不能被继承,否则子类将可以通过覆盖父类方法来改变对象状态。常用的做法是把类声明为final,还有另一种方法是隐藏或保护所有的构造函数,只提供一个静态factory方法来创建对象(参见item 1)。
3. 所有属性都声明为final。
4. 所有属性都声明为私有。

今天给领导博客的广告做了些调整。原本首页横幅广告的位置是固定的,即便进入单篇文章它也还在原地:

又是很简单的一节

public类不应该有public属性,必须使用访问方法(accessor methods)

有些情况下,会需要写一些纯粹用作数据存储,而没有任何行为的类,比如:

// Degenerate classes like this should not be public!
class Point {
	public double x;
	public double y;
}

上一节所说,这样做会破坏数据封装,所以Object-Oriented语言的死忠分子们会拒绝接受这样的写法,并要求全面使用访问方法改写它:

这节比较简单,都是各种面试考烂了的东西。

类和属性的访问控制应尽可能严格

访问控制是Java语言中最重要的概念之一,它使得对数据的封装成为可能。好的数据封装可以有效分隔一个系统中的不同模块,增加系统可靠性,便于维护,而且使各模块的开发和重构完全独立,实现细节上的改动不会影响对外开放的API。

对于类,有两个访问级别:package-private和public。其中前者是默认的,如果一个类没有被声明为public,那么它就是package-private,也就是说,它只在其自己所在的软件包内可见。这两个级别的选择没什么复杂的:只有要作为API开放的类,才声明为public,其余实现的细节,则尽可能都声明为package-private。如果一个非public类只被另外一个类使用,那么它应该被定义成使用者的私有内嵌类(private nested class),这样可以进一步减小它的可见范围,使其更好地被保护。

前一阵子准备雅思考试,没时间继续Effective Java,现在考完了,要捡起来。

实现Comparable接口

Comparable接口只有唯一一个方法:

public interface Comparable<T> {
	int compareTo(T t);
}

compareTo方法的返回值是一个整数。对于a.compareTo(b),如果返回负值,则表明a < b;正值表明a > b;如果返回0,则说明a与b相等。如果a与b类型不同,应该弹出ClassCastException。

今天为一个网站改数据,遇到个小问题。

从数据库中提取一系列记录,其中一列是一个业务编号,为通用性考虑,这一列采用了字符串类型,而其内容却是数字,比如"1","2","12"等等。今天删除了某些记录,又新加入了一些,所以这一列的顺序相对于主关键字来说就混乱了。提取的数据需要按这一列排序,于是就简单写了个查询:

SELECT product_type_label, product_name FROM product 
    WHERE product_type = 'ENTREES' 
    ORDER BY product_type_label;

结果自然是错的:

1 만두 Raviolis 餃子
10 떡볶이 Toppokki トッポッキ
11 Boulots assaisonn&eacute;s
12 육회 Steak tartare cor&eacute;en ユッケ
13 닭볶음면 Nouilles saut&eacute;es avec poulet チキン焼きそば
14 Assortiment de beignets
2 김밥 Maki cor&eacute;en のり巻き
3 김치전 Kimchijeon キムチジョン
4 해물 파전 Crêpe cor&eacute;enne de fruits de mer 海鮮チヂミ
5 잡채 Jabchai チャプチェ
6 깐풍기 Saut&eacute; de poulet カンプンギ
7 오징어 볶음 Saut&eacute; de calamar piquant
8 새우튀김 Beignets de crevettes 天ぷら
9 김치돼지볶음 Saut&eacute; de Kimchi avec porc キムチ豚炒め

第4页 共10页