包私有类中的`public`修饰符
Posted
技术标签:
【中文标题】包私有类中的`public`修饰符【英文标题】:`public` modifier in package-private classes 【发布时间】:2016-06-03 14:04:15 【问题描述】:最近,我正在编写一个我决定为包私有的类(也就是说,没有访问修饰符,或者 默认 一个)。它有一个内部类和一些private
辅助方法,以及一个旨在由同一包中的类使用的方法。所有这些班级成员都是static
。但是后来我有了一个想法:这个方法应该有public
访问修饰符还是没有访问修饰符,就像包含它的类一样?
一方面,由于类本身是包私有的,它只能在其包内被访问和使用,所以没有实际的理由来创建方法public
。但同时,从语义上来说,这个方法是打算成为类的一个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;
// ...
这里最好的选择是什么?是否有经验法则来决定在这种情况下使用哪些访问修饰符?
【问题讨论】:
经验法则:从限制性最强的修饰符开始,仅在必要时更改(“向上”一级)。 我真的不认为这是对 C# 问题的欺骗,因为 C# 中的internal
实际上与 Java 中的默认访问具有完全不同的语义。答案是相似的,但我认为这个问题不一定是真正的重复。
@DanielPryden:那是因为我链接了错误的问题。 sigh This is the right one.(刚回来重新打开,看到有人已经这样做了。)对于这个问题(和那个问题)来说,语义足够相似。
可以认为这是***.com/questions/19161439/…的副本
【参考方案1】:
一个方法应该比它的封闭类具有更高的可见性有两个原因:
1。封闭类是一个基类
... 旨在由子类扩展,最终可能是公共的,并且手头的方法应该是公开的。例如
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();
我看不出有什么理由像您的情况一样将此方法应用于静态方法。
2。方法必须是公开的
... 因为它从一个接口实现了一个方法。不幸的是,Java 不提供包私有或私有接口方法。因此,即使没有任何子类,即使接口本身可能是包私有(甚至嵌套私有),以下内容也是常见的:
final class Y implements X
@Override
public void x()
这(不幸的是)也适用于接口上的静态类,它只能是公共的:
interface I
/* implicitly public */ static void x()
【讨论】:
【参考方案2】:我个人认为制作public
方法可能会误导读者。
另一方面,它支持可扩展性(如果该类应该公开,更改会更容易)。
每当我需要在可读性和可扩展性之间进行选择时,我都会遵循 YAGNI 原则并选择可读性。
有关 YAGNI 的更多信息,请参见 wiki:https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it
【讨论】:
【参考方案3】:对此有两种观点:
一组更喜欢添加不必要的修饰符(例如,public
在这种情况下,private
在私有类中)作为“代码中的文档”的一种形式。例如,这是 Eric Lippert 在his answer on this related C# question 中所支持的观点。
另一组更喜欢从不添加没有功能影响的源代码:如果public
没有做任何事情,那么它就不属于你的源代码。
我认为我现在坚定地站在第二阵营,但我理解第一阵营的论点,我认为它并不像最初看起来那么简单。理性的人可能会不同意,这就是为什么(如大括号和空格)这是你应该在项目风格指南中决定一次,然后不再辩论的原因。 :-)
【讨论】:
“一个群体更喜欢添加不必要的修饰符” - 我永远无法理解这个阵营。以上是关于包私有类中的`public`修饰符的主要内容,如果未能解决你的问题,请参考以下文章