java默认访问权限 - protected




包私有类中的公共方法 (5)

在包私有类中将方法标记为public是否有所不同?

class SomePackagePrivateClass
{
    void foo();          // package private method

    public void bar();   // public method
}

这里foobar之间的可见性是否有任何实际差异?


foo具有default package visibility ,其中bar具有public可见性


使用继承的示例:

A.java

package pkg1

class A {
  void foo();
  public void bar() {};
}

B.java

package pkg1

public class B extends A{

}

C.java

package pkg2

public class C {
  public void doSomething() {
   B b = new B();
   b.bar(); //ok
   b.foo(); //won't work, since foo() is not visible outside of package 'pkg1'

   A a = new A(); //won't work since A is not visible outside of package 'pkg1'
   a.bar(); //won't work, since a cannot be created
  }
}

如果该类不会被另一个更可见的子类*扩展,唯一的区别是意图的清晰度 。 声明所有方法包私有使得将来的读者更难以确定哪些方法是由同一包中的其他类调用的。

* 作为我的设计解决方案没有多大意义,但技术上仍然可行。


是。 包私有类中的public方法可能很有用。 来自java库的示例性示例(取自经典的“有效java”):

你见过java.util.JumboEnumSet, java.util.RegularEnumSet ?? 可能不是,因为它们是私有的,并且在文档中没有提及。

你有没有用过它们? 可能是。 它们由java.util.EnumSet.noneOf(...)的静态方法返回。 虽然您无法自己构造它们,但可以在从此方法返回时使用它们的公共方法。

好消息是你不知道你正在使用哪一个,甚至不知道它们存在。 Java根据参数决定哪一个更有效,并且可能在较新版本中使用不同的on。 您只能通过他们的通用界面引用它们来访问它们的功能(无论如何这是一个很好的做法!!)


除非通过公共(或受保护的嵌套)类扩展类,否则它几乎没有什么区别。

为了保持一致,我会去public 。 除了publicprivate之外,方法应该是罕见的。

包私有java.lang.AbstractStringBuilder类中有许多公共方法的示例。 例如, length()AbstractStringBuilder是公共的,并在公共类StringBuilder中公开(在StringBuffer重写以添加同步)。





public-method