我閱讀布魯斯Eckel的Thinking in Java並有一個鍛鍊,我只是沒有得到:瞭解Java包和工廠
PG。 161:練習8:(4)以下 示例Lunch.java的形式, 創建一個名爲 的ConnectionManager,它管理Connection對象的固定 數組。 客戶端編程人員 必須無法顯式創建連接對象, ,但只能通過ConnectionManager中的靜態 方法獲取它們。當ConnectionManager用完對象 時,它將返回一個空引用。在main()中測試 類。
我想出了以下解決方案:
// TestConnection.java
import java.util.*;
public class TestConnections {
public static void main(String[] args) {
Connection cn = Connection.makeConnection();
for (int i = 0; i != 6; ++i) {
Connection tmp = ConnectionManager.newConnectiton();
if (tmp == null)
System.out.println("Out of Connection objects");
else {
System.out.println("Got object: " + tmp);
}
}
}
}
和第二文件在同一目錄意味着一切都在相同的默認包結束:
// ConnectionManager.java
class Connection {
private Connection() {}
static Connection makeConnection() {
return new Connection();
}
}
public class ConnectionManager {
static private Connection[] _connections = new Connection[5];
private ConnectionManager() {}
static public Connection newConnectiton() {
for (int i = 0; i != _connections.length; ++i) {
if (_connections[i] == null) {
_connections[i] = Connection.makeConnection();
return _connections[i];
}
}
return null;
}
}
的事情是,客戶端程序可以通過靜態Connection.makeConnection
工廠直接創建Connection對象,這似乎違反了練習目標。然而,如果我使ConnectionManager.java成爲一個單獨的包,那麼導入它會抱怨它找不到Connection
的定義。
我覺得這裏有些事情要過去,但我不確定是什麼。
下面是其在問題爲引用Lunch.java的代碼:
//: access/Lunch.java
// Demonstrates class access specifiers. Make a class
// effectively private with private constructors:
class Soup1 {
private Soup1() {}
// (1) Allow creation via static method:
public static Soup1 makeSoup() {
return new Soup1();
}
}
class Soup2 {
private Soup2() {}
// (2) Create a static object and return a reference
// upon request.(The "Singleton" pattern):
private static Soup2 ps1 = new Soup2();
public static Soup2 access() {
return ps1;
}
public void f() {}
}
// Only one public class allowed per file:
public class Lunch {
void testPrivate() {
// Can't do this! Private constructor:
//! Soup1 soup = new Soup1();
}
void testStatic() {
Soup1 soup = Soup1.makeSoup();
}
void testSingleton() {
Soup2.access().f();
}
} ///:~
偉大的書,但在這一個布魯斯使它比需要更混亂一點。他的變量和方法的命名也可以在這個例子中稍微改進一點。 – 2010-11-09 09:44:15