Java接口中的方法应该使用还是不使用公共访问修饰符来声明?
Java接口中的方法应该使用还是不使用public
访问修饰符来声明?
从技术上讲,这当然没有关系。 实现interface
类方法始终是public
。 但是什么是更好的约定?
Java本身并不一致。 请参阅Collection
vs. Comparable
或Future
vs. ScriptEngine
。
JLS明确表示:
对于在接口中声明的方法,冗余地指定
public
和/或abstract
修饰符是允许的,但不鼓励作为样式。
在Java界面中应该省略public修饰符(在我看来)。
由于它没有增加任何额外的信息,它只是吸引注意力从重要的东西。
大多数风格指南都会build议您不要这样做,但是最重要的是在代码库中保持一致,尤其是对于每个接口。 下面的例子很容易混淆不熟悉Java的人:
public interface Foo{ public void MakeFoo(); void PerformBar(); }
尽pipe事实上这个问题已经被很久以前问过了,但是我觉得一个全面的描述会澄清为什么在接口的常量之前不需要使用公共抽象方法和public static final。
首先,接口用于为一组不相关的类指定通用的方法,每个类都有唯一的实现。 因此,不可能将访问修饰符指定为私有的,因为不能被其他类访问而被覆盖。
第二,虽然可以启动接口types的对象,但接口是由实现它的类来实现的,而不是inheritance的。 而且由于一个接口可能由不在同一个包中的不相关类实现(实现),所以受保护的访问修饰符也是无效的。 所以对于访问修饰符,我们只剩下公共select。
第三,接口没有任何数据实现,包括实例variables和方法。 如果在接口中插入实现的方法或实例variables是合乎逻辑的原因,那么它必须是inheritance层次结构中的超类,而不是接口。 考虑到这个事实,因为在接口中不能实现任何方法,所以接口中的所有方法都必须是抽象的。
第四,接口只能包含常量作为其数据成员,这意味着它们必须是最终的,当然最终常量被声明为静态的,只保留它们的一个实例。 因此静态final也是接口常量必须的。
所以最后,虽然在接口的常量之前使用方法和公共静态最终使用公共抽象是有效的,但由于没有其他选项,它被认为是多余的,没有使用。
我使用了public
修饰符的declare方法,因为它使得代码更具可读性,特别是语法高亮。 在我们最近的项目中,我们使用了Checkstyle,它在接口方法中显示了一个public
修饰符默认configuration的警告,所以我切换到忽略它们。
所以我不确定什么是最好的,但是我真的不喜欢在接口方法上使用public abstract
。 Eclipse有时用“Extract Interface”进行重构。
如果没有接口,我总是写我要用的东西,而我正在写一个直接的实现,也就是说,我会使用public
。
我会避免把修饰符默认应用。 正如指出的那样,可能导致不一致和混乱。
我看到的最糟糕的是与声明为abstract
方法的接口…
默认情况下,接口中方法的公开和抽象的原因对我来说似乎是合乎逻辑和明显的。
一个接口中的方法默认是抽象的,强制实现类提供一个实现,默认情况下是公共的,所以实现类可以访问。
在代码中添加这些修饰符是多余的和无用的,只能导致您缺乏对Java基础知识和/或理解的结论。
我更喜欢跳过它,我读的地方默认,接口是public
和abstract
。
令我惊讶的是,这本书 – Head First Design Patterns正在使用public
的接口声明和接口方法……这让我重新思考一遍,然后我登上了这篇文章。
无论如何,我认为应该忽略冗余信息。
这完全是主观的。 我忽略了冗余的public
修饰符,因为它看起来像混乱。 正如其他人所说 – 一致性是决定的关键。
有趣的是,C#语言devise者决定强制执行此操作。 在C#中声明一个接口方法是公共的,实际上是一个编译错误。 虽然一致性在跨语言中可能并不重要,但我想这与Java没有直接的关系。
随着Java 8/9中接口方法的private
, static
, default
修饰符的引入,事情变得更加复杂,我倾向于认为完整的声明更具可读性(需要Java 9编译):
public interface MyInterface { //minimal int CONST00 = 0; void method00(); static void method01() {} default void method02() {} private static void method03() {} private void method04() {} //full public static final int CONST10 = 0; public abstract void method10(); public static void method11() {} public default void method12() {} private static void method13() {} private void method14() {} }
人们将会在他们的IDE或Javadoc中从代码完成中学习你的接口,而不是通过阅读源代码。 所以把“公开”放在源头上是没有意义的 – 没有人在阅读资料来源。