你是人间的四月天

  • 四二. 慎用可变参数
  • 四三. 返回零长度的数组或者集合,而不是null
  • 四四. 为所有导出的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
.......