以下是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();

|