如何公开私有类的方法?

时间:2020-08-13 14:25:02

标签: java

我正在尝试编写一个库。我们称之为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");,因为已经完成了一些初始化。

我该如何解决?

2 个答案:

答案 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修饰符不使用嵌套类的解决方案

com.lib软件包中的

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!");
    }
}
相关问题