在編碼時遇到一個問題:套件內定義一個介面,另一套件實作它,採用介面隔離與依賴倒置原則,將兩套件依賴關係倒置。實作類使用工廠模式實例化,因此實作類不想暴露給套件外,但仍需實作 public 介面。問題來了:若類是 default,成員方法是 public,存取限制究竟如何?
package mytest;
public interface ClassAccessTest {
void getData();
CharSequence getString();
}
package classaccesstest;
import mytest.ClassAccessTest;
class ClassAccessTestImp implements ClassAccessTest { // default 類
int mA = 0;
ClassAccessTestImp(int a) { mA = a; }
public void getData() { System.out.println("the data is " + mA); }
public CharSequence getString() { return "the data is " + mA; }
}
public class Factory {
public static ClassAccessTest getAccessTest() {
return new ClassAccessTestImp(10);
}
}
package mytest;
import classaccesstest.Factory;
// import classaccesstest.ClassAccessTestImp; // 故意不導入
public class TestMain {
public static void main(String[] args) {
Factory.getAccessTest().getString(); // 正常運作
// ClassAccessTest test = new ClassAccessTestImp(10); // 編譯錯誤:ClassAccessTestImp not visible
}
}
TestMain 中使用工廠取得介面並呼叫方法 成功;直接 new 實作類 編譯失敗。
結論:Java 中類的存取權限可以小於成員的存取權限。在依賴倒置與套件封裝需求下,可滿足「隱藏實作類、暴露公共介面」的設計目標。