我有两个班级:
public class Class1{}
public class Class2{
private void simpleMethod(){ /*...*/ }
}
在Class2
我有私有方法simpleMethod()
,我想在同一个项目的Class1
中使用它。我不想将此方法重命名为public
,因为我不想在我的API中显示它。我可以创建public
方法而不在API中显示它吗?或者,别的什么?
答案 0 :(得分:13)
如果Class1
和Class2
都在同一个套餐中,您只需删除private
修饰符,即可生成方法package-private。这样,它就不会在API中公开,您可以从Class1
访问它。
在:
public class Class2 {
// method is private
private void simpleMethod() { ... }
}
后:
public class Class2 {
// method is package-private: can be accessed by other classes in the same package
void simpleMethod() { ... }
}
答案 1 :(得分:8)
如果两个类都在同一个包中,那么您可以将simpleMethod
保留为默认可见性,因此它只能由类和同一包中的类使用。
package org.foo;
public class Class1 {
//visibility for classes in the same package
void simpleMethod() { }
}
package org.foo;
public class Class2 {
public void anotherMethod() {
Class1 class1 = new Class();
class1.simpleMethod(); //compiles and works
}
}
package org.bar;
import org.foo.Class1;
public class Class3 {
public void yetAnotherMethod() {
Class1 class1 = new Class1();
class1.simpleMethod(); //compiler error thrown
}
}
答案 2 :(得分:3)
那么,另一种方法是拥有两个不同的界面。一个用于您的公共API,另一个用于您的内部API,您的Class2
对象将实现这两者。处理API的每个人都会通过您公开的公共界面与之交谈
public class Class2 implements PublicApi2 {
public void somePrivateMethod() {
...
}
@Override
public void somePublicMethod() {
...
}
}
(在这里没有实现两个接口,因为事实上不需要'私有',因为你的库/框架的对象/任何可以处理具体类的东西,但这取决于你)
客户端将始终将您的对象引用为“PublicApi2”类型,并且在您的内部clases将永远不会处理具体实现(Class2)。
答案 3 :(得分:2)
除了上述场景之外,您还可以使用反射API访问私有方法,如下所示:
Class a = Class.forName("");
Method method = a.getDeclaredMethods()[0];//retrieve your method here
method.setAccessible(true);
答案 4 :(得分:1)
使用protected
或完全省略访问修饰符。
https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html