当前位置: 首页 > 知识库问答 >
问题:

package-private类中的`public`修饰符

钦海荣
2023-03-14

最近,我正在编写一个类,我决定将其作为包私有(即没有访问修饰符,或默认的)。它有一个内部类和一些private帮助器方法,还有一个方法打算由同一个包中的类使用。所有这些类成员都是static。但是后来我有了一个想法:这个方法应该有public访问修饰符还是没有访问修饰符,就像包含它的类一样?

一方面,由于类本身是package-private的,只能在其包内访问和使用,因此没有实际的理由将public方法设为。但同时,从语义上讲,这个方法意在成为类的公共特性,即类的一个意在外部使用的特性,因此修改它的访问本身将是有意义的。

对于那些喜欢查看代码的用户,

final class DummyRemover {

    private DummyRemover() {

    }

    public static int remove(Map<String, ClassNode> classMap) {
        return 0;
    }

    // ...
}
final class DummyRemover {

    private DummyRemover() {

    }

    // Notice the modifier.
    static int remove(Map<String, ClassNode> classMap) {
        return 0;
    }

    // ...
}

这里最好的选择是什么?对于在这种情况下使用什么访问修饰符,有经验法则吗?

共有1个答案

韩欣怿
2023-03-14

一个方法应该比它的封闭类具有更高的可见性有两个原因:

...这是为了通过子类来扩展的,子类最终可能是公共的,并且手边的方法应该是公共可用的。例如。

abstract class Base {
    public void x() {}
}

public class Sub extends Base {
}

// Now, everyone can call:
new Sub().x();

但是,通常情况下,如果这是您的意图,您无论如何都会在接口中声明您的方法x()。即使您没有在接口中声明x(),从设计的角度来看,最好将基方法保持在与其类相同的可见性级别,并在子类中“打开”方法,因为这样可以更清楚地传达意图:

abstract class Base {
    void x() {}
}

public class Sub extends Base {
    /** public Javadoc here */
    @Override
    public void x() {
        super.x();
    }
}

我看不出有什么理由像您的情况一样将这种方法应用于静态方法。

...因为它从接口实现了一个方法。不幸的是,Java不提供package-private或private接口方法。因此,即使没有任何子类,即使接口本身可能是包专用的(甚至是嵌套专用的),下面的操作也是常见的:

final class Y implements X {
    @Override
    public void x() {}
}

这(不幸的是)也适用于接口上的静态类,这些类只能是公共的:

interface I {
    /* implicitly public */ static void x() {}
}
 类似资料: