以下是TIJ中的代码:
class Soup {
private Soup() {}
// (1) Allow creation via static method:
public static Soup makeSoup() {
return new Soup();
}
// (2) Create a static object and
// return a reference upon request.
// (The "Singleton" pattern):
private static Soup ps1 = new Soup();
public static Soup access() {
return ps1;
}
public void f() {}
}
class Sandwich { // Uses Lunch
void f() { new Lunch(); }
}
// Only one public class allowed per file:
public class Lunch {
void test() {
// Can't do this! Private constructor:
//! Soup priv1 = new Soup();
Soup priv2 = Soup.makeSoup();
Sandwich f1 = new Sandwich();
Soup.access().f();
}
}
------------ 返回值是Soup的对象引用。这里这个类是一个自引用的类,JDK中util包中如LinkedList之类就是这样实现的。access是一个静态方法,所以应该用类名直接调用。
而且,access()返回一个Soup对象,所以可以访问类方法f.
不能Soup priv1 = new Soup();
因为构造函数是私有方法
通过public static Soup access() {
return ps1;
}
实际上等于调用了一次构造函数
Soup.access()返回的是Soup的一个对象,f()是Soup的一个非私有方法,用Soup的一个对象调用它在正常不过了
所以:Soup.access().f();