使用隐藏的某些类/方法导出Android库

时间:2016-05-03 16:30:45

标签: java android

我有一个必须作为库导出的项目。

该项目有多个包,我希望无法从将托管我的库的应用程序访问一些公共方法/类。快速举例:

package test.package1
import test.package2.*;

//Class1 can be accessed from external
public class Class1 {
    public Class1() {}

    public doSomething(){

        //Class2, instead, should be only "library-internal" and not accessed from external
        Class2 c2 = new Class2();
        c2.doSomething();
    }
}
package test.package2

//Library private class
public class Class2 {

     public doSomething(){
     }
}

我发现很多帖子都在谈论这个问题:

但是这些都没有解决我的问题在一个清晰的模式(对我来说),所以,我要问的是,我做错了是包装结构还是存在一个优雅的解决方案问题

我认为我可以快速解决问题,只是将所有类放在同一个包中,只公开我想要的内容,可以从外部访问,但我不认为这是一个很好的解决方案,并且会变得更糟项目可读性。

==============

编辑1:我尝试使用更具体的示例扩展我的问题

想象一下,我有一个名为" test.model "我把所有将与SQLite数据库交互的类放在哪里。

现在,这个包中的所有类都必须是所有其他类的库内访问权限"内部"包。

总是在同一个应用程序中,我有一个名为" test.ui "在那里我把所有的碎片和活动。所有这些ui组件都需要访问" test.model "中出现的类。包裹,但我不想要" test.model "可以从将托管库的应用程序中看到包。

" test.ui "中的活动和片段,可以从托管该库的应用程序中使用。

下面是项目结构的一个例子:

//I want that this package is for library "internal" use only
 --- package test.model 
 ------ Author.java
 ------ Book.java

 //This package can be accessed from project hosting my library
 --- package test.ui
 ----- BookListFragment.java   //Can access, with a private method, to Book class
 ----- AuthorListFragment.java //Can access, with a private method, to Author class

1 个答案:

答案 0 :(得分:0)

您需要将Class2移动到test.package1中,然后如果您将Class2的可见性从公共级别更改为包级别(即从类声明中删除“public”一词),这应该可以达到您想要的效果。

如果你真的不想在包中移动类,那么你真的需要看看更复杂的Java OOP交互。

如果您对类的操作类型更具体,那么您可能会得到更好的示例。