我正在尝试编写一个库。我们称之为myLib
。
public class MyLib {
public SomeClass someClass = SomeClass.INSTANCE();
private static MyLib _instance = null;
public static MyLib INSTANCE()
{
if (_instance == null)
_instance = new MyLib();
return _instance;
}
}
SomeClass
看起来像这样:
class SomeClass {
private static SomeClass _instance = null;
public static SomeClass INSTANCE()
{
if (_instance == null)
_instance = new SomeClass();
return _instance;
}
public void print(String message){
System.out.println(message);
}
}
我希望用户能够写:MyLib.INSTANCE().someClass.print("Hello World!");
但是,以当前形式print
无法访问。我不希望用户能够跳过MyLib.INSTANCE()
并写SomeClass.INSTANCE().print("Hello World");
,因为已经完成了一些初始化。
我该如何解决?
答案 0 :(得分:1)
要使SomeClass.print
可以访问,SomeClass
本身必须可以访问。
要使SomeClass.INSTANCE
不可访问,请删除public
修饰符。由于您仅从同一软件包访问,因此请使用没有默认访问修饰符的“默认”访问权限:
// public access
public class SomeClass {
// package-only access
static SomeClass INSTANCE() { }
// public access
public void print(String message) { }
}
答案 1 :(得分:0)
您必须保留SomeClass
作为内部私有类,以防止其直接访问和在MyLib
类中使用。
public static class MyLib {
public SomeClass someClass = SomeClass.INSTANCE();
private static MyLib _instance = null;
public static MyLib INSTANCE()
{
if (_instance == null)
_instance = new MyLib();
return _instance;
}
private static class SomeClass {
private static SomeClass _instance = null;
public static SomeClass INSTANCE()
{
if (_instance == null)
_instance = new SomeClass();
return _instance;
}
public void print(String message){
System.out.println(message);
}
}
}
编辑:
使用protected
修饰符不使用嵌套类的解决方案
MyLib
类
package com.lib;
public class MyLib {
public SomeClass someClass = SomeClass.INSTANCE();
private static MyLib _instance = null;
public static MyLib INSTANCE()
{
if (_instance == null)
_instance = new MyLib();
return _instance;
}
}
com.lib软件包中的 SomeClass
类
package com.lib;
public class SomeClass {
private static SomeClass _instance = null;
protected static SomeClass INSTANCE()
{
if (_instance == null)
_instance = new SomeClass();
return _instance;
}
public void print(String message){
System.out.println(message);
}
}
在您的主项目(即不同的程序包)中访问它
package com.project;
public class MainClass {
public static void main(String[] args) {
MyLib.INSTANCE().someClass.print("Hello World!");
}
}