你是人间的四月天
- 四二. 慎用可变参数
- 四三. 返回零长度的数组或者集合,而不是null
四四. 为所有导出的API元素编写文档注释
- 为了正确地编写API文档,必须在每个被导出的类,接口,构造器,方法和域声明之前增加一个文档注释
方法的文档注释应该简洁地描述出它和客户端之间的约定。
第八章 通用程序设计
- 为了正确地编写API文档,必须在每个被导出的类,接口,构造器,方法和域声明之前增加一个文档注释
四五. 将局部变量的作用域最小化
- 要使局部变量的作用最小化,最有力的方法就是在第一次使用它的地方声明。
- 几乎每个局部变量的声明都应该包含一个初始化表达式。
四六 for-each循环优先于传统的for循环
- 对两个集合进行嵌套迭代时常犯的错误如下:
- 对两个集合进行嵌套迭代时常犯的错误如下:
public class Tets0426 {
enum Suit {CLUB, DIAMOND, HEART , SPADE}
enum Rank {ACE,DEUCE, THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING}
static class Card{
public Card(Suit suit,Rank rank){
}
}
public static void main(String[] args) {
Collection<Suit> suits = Arrays.asList(Suit.values());
Collection<Rank> ranks = Arrays.asList(Rank.values());
List<Card> deck = new ArrayList<>();
for (Iterator<Suit> i = suits.iterator(); i.hasNext();) {
for (Iterator<Rank> j = ranks.iterator(); j.hasNext();) {
Suit s1 = i.next();
Rank r1 = j.next();
deck.add(new Card(s1,r1));
System.out.println(s1+" "+r1);
}
}
}
}
- 上述代码问题在于,在迭代器上对外部的集合(suits)调用了太多次next方法。我们应该从外部的循环进行调用,以便每种花色调用一次,但它却是从内部循环调用,因此它是每张牌调用一次。在用完所有花色之后,循环就会抛出
NoSuchElementException
异常。 - 如果不幸,外部集合的大小是内部集合大小的几倍—-可能因为它们是相同的集合—-循环就会终止,但是不会完成你想要的工作。例如,下面是个考虑不周的尝试,要打印一对骰子的所有可能的滚法。
public class TestItrator {
enum Face {
ONE, TWO , THREE, FOUR, FIVE, SIX
}
public static void main(String[] args) {
Collection<Face> faces = Arrays.asList(Face.values());
for (Iterator iterator = faces.iterator(); iterator.hasNext();) {
// Face f = (Face) iterator.next();
for (Iterator iterator1 = faces.iterator(); iterator1.hasNext();) {
// System.out.println(f + " " + iterator1.next());
System.out.println(iterator.next() + " " + iterator1.next());
}
}
}
}
打印结果如下:
ONE ONE
TWO TWO
THREE THREE
FOUR FOUR
FIVE FIVE
SIX SIX
正确的代码:
public class TestItrator {
enum Face {
ONE, TWO , THREE, FOUR, FIVE, SIX
}
public static void main(String[] args) {
Collection<Face> faces = Arrays.asList(Face.values());
for (Iterator iterator = faces.iterator(); iterator.hasNext();) {
Face f = (Face) iterator.next();
for (Iterator iterator1 = faces.iterator(); iterator1.hasNext();) {
System.out.println(f + " " + iterator1.next());
// System.out.println(iterator.next() + " " + iterator1.next());
}
}
}
}
正确的打印结果如下:
ONE ONE
ONE TWO
ONE THREE
ONE FOUR
ONE FIVE
ONE SIX
TWO ONE
.......