匿名內(nèi)部類
泛型還可以使用于內(nèi)部類和匿名內(nèi)部類。
class Customer {
private static long counter = 1;
private final long id = counter++;
private Customer() {
}
public String toString() {
return "Customer " + id;
}
public static Generator<Customer> generator() {
return new Generator<Customer>() {
@Override
public Customer next() {
return new Customer();
}
};
}
}
class Teller {
private static long counter = 1;
private final long id = counter++;
private Teller() {
}
public String toString() {
return "Teller " + id;
}
public static Generator<Teller> generator = new Generator<Teller>() {
@Override
public Teller next() {
return new Teller();
}
};
}
public class BankTeller {
public static void serve(Teller t, Customer c) {
System.out.println(t + " serves " + c);
}
public static void main(String[] args) {
Random rand = new Random(47);
Queue<Customer> line = new LinkedList<>();
Generators.fill(line, Customer.generator(), 15);
List<Teller> tellers = new ArrayList<>();
Generators.fill(tellers, Teller.generator, 4);
for (Customer c : line) {
serve(tellers.get(rand.nextInt(tellers.size())), c);
}
}
}
// Outputs
Teller 3 serves Customer 1
Teller 2 serves Customer 2
Teller 3 serves Customer 3
Teller 1 serves Customer 4
Teller 1 serves Customer 5
Teller 3 serves Customer 6
Teller 1 serves Customer 7
Teller 2 serves Customer 8
Teller 3 serves Customer 9
Teller 3 serves Customer 10
Teller 2 serves Customer 11
Teller 4 serves Customer 12
Teller 2 serves Customer 13
Teller 1 serves Customer 14
Teller 1 serves Customer 15
上面的Customer
和Teller
都通過使用匿名內(nèi)部類實(shí)現(xiàn)了Generator
接口,并且他們都只有private
的構(gòu)造器,這就意味著要想創(chuàng)建這兩個(gè)類的對(duì)象,必須使用generator
方法。其中,Customer
類的generator()
方法每次調(diào)用都會(huì)返回一個(gè)新的Generator<Customer>
對(duì)象,但我們其實(shí)并不需要多個(gè)Generator
對(duì)象。這時(shí),就可以像Teller
類一樣,只創(chuàng)建一個(gè)public
的generator
對(duì)象。在main
方法中,這兩種創(chuàng)建Generator
對(duì)象的方法在fill()
中都用到了。
由于Customer
中的generator()
方法,以及Teller
中的Generator
對(duì)象都聲明成static
,所以它們都無法作為接口的一部分,因此不能用接口這種特定的慣用法來泛化這兩者。盡管如此,它們?cè)?code>fill()方法中都工作得很好。(//TODO 看不懂)