大家好:
    最近做一个导航类项目,客户要我们把功能以SDK的形式对外提供,然后我对一些java包的访问权限问题比较纠结。
    问题是这样的,比如我们的SDK内部com.app.a、com.app.c包需要访问com.app.b包里的方法,但是com.app.b包的内容我又不想让提供给外界,只想内部被其他包调用,如果将com.app.b里的方法设置成private的,com.app.a、com.app.c都访问不到,如果设置成公共的,最后发布整个代码都会打到JAR包里,com.app.b的内容都泄露了。
    请问怎么做到com.app.b只让SDK内部的包访问,而不允许外界访问?谢谢大家!javajar

解决方案 »

  1.   

    对外提供的方法都要提供API文档,你只需在文档中包含想要对外的方法即可,调用其它方法,属于后果自负型
      

  2.   

    你知道接口的含义吗?
    在Java设计模式里面,有这样一个概念,可以把Java的代码分成两类,
    一类是用来保存数据的,一类是用来干一些事情的。当然也会有两者兼有的类,咱们暂且不谈。
    用于保存数据的类,我们时常会用到,比如 ORM 框架里的POJO 等等。
    用于完成事情的类,我们也会常用到,比如 ORM 框架中的DAO 等等,它操纵数据。接口,属于完成事情的一种抽象,你必须配一个实现类,来实现这件事情。楼主想要实现,b包中的代码被保护,a和c包的代码被共享,那么,可以把b包中的类进行分类。
    将b包中,保存数据的类,进行共享。将b包中完成事情的类,提取出接口Interface。
    将Interface共享给a和c包,原有b包中的行为类,保留下来,内部使用。
    你想对外公开哪个类的哪个方法,只要在Interface中,写上那个方法就可以了,因为Interface被你公开了,但是具体的实现类,在b包中,不提供给对方就可以了。如果整个代码需要接口的实现类,你又不想泄露真实的实现类,那就写一个假实现,提供过去,当然了,最好是写一个工厂类,提供这个假实现,到时候,和你项目集成的时候,只要修改工厂类,将假实现替换成b包中具体实现类即可。
      

  3.   

    楼主的问题就好像 既要让某包被外包可访问,又要让它不可被外包访问,这本身是矛盾的
    对于java的包访问权限来说,它可不会区分项目外还是项目内唯一的区别是项目内的你希望对之开放的包你拥有设计权限,我觉得两种1.通过继承,设置访问权限protected,那只有有继承关系的外包能访问了
    2.开始就设计在一个包里