如果在一个Java接口中的方法有或没有被宣布public
访问修饰符?
从技术上讲也没关系,当然。 实现一个A类方法interface
总是public
。 但是,什么是更好的惯例?
Java本身不在此一致。 例如,见Collection
与Comparable
,或Future
对ScriptEngine
。
如果在一个Java接口中的方法有或没有被宣布public
访问修饰符?
从技术上讲也没关系,当然。 实现一个A类方法interface
总是public
。 但是,什么是更好的惯例?
Java本身不在此一致。 例如,见Collection
与Comparable
,或Future
对ScriptEngine
。
该JLS了这一点:
这是允许的,但不鼓励作为一个风格问题,以冗余指定
public
和/或abstract
修饰符在接口中声明的方法。
市民修饰符应该在Java接口被省略(在我看来)。
因为它不添加任何额外的信息,它只是吸引注意力从重要的东西了。
大多数风格导游会建议你离开它,当然,最重要的是要在你的代码库一致,尤其是对每个接口。 下面的例子可以很容易迷惑人,谁不是在Java的100%流利的:
public interface Foo{
public void MakeFoo();
void PerformBar();
}
尽管这个问题已经很久以前问,但我觉得一个全面的描述将阐明为什么没有必要使用方法和公共静态决赛前公共抽象接口的常量之前。
首先接口都用于指定一组不相关的类的针对每类将有一个独特的实现常用的方法。 因此,不可能指定访问修饰符为private,因为它不能被其他类访问被覆盖。
其次,尽管一个可以启动的接口类型的对象,但界面是由实现它,而不是继承的类实现。 而且,由于一个接口可能被实现(实现)通过不同的不相关的类其不是在同一封装因此保护访问修饰符无效为好。 所以对于访问修饰符,我们只剩下公共选择。
三,接口不具有任何数据执行包括实例变量和方法。 如果有合理的理由插入实现的方法或实例变量在接口上,那么它一定是在继承层次超类而不是接口。 考虑到这个事实,因为没有任何方法可以在一个接口来实现,因此在接口中的所有方法必须是抽象的。
四,接口只能包括作为其数据成员不变,这意味着他们必须是终局的,当然最终常量被声明为静态只保留其中一个实例。 因此静态最后还对界面常数必须的。
所以在最后,虽然使用公共抽象前一个接口的常量之前的方法和公共静态最终是有效的,但因为没有其他选择它被认为是多余的,不能使用。
通过引入private
, static
, default
在Java 8/9接口方法改性剂,事情变得更加复杂,我倾向于认为完全声明是更具可读性(需要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() {}
}
我会避免把那个默认应用的改性剂。 正如指出的那样,它可以导致矛盾和混乱。
我看到的最糟糕的是声明方法的接口abstract
...
我用申报方法与public
改性剂,因为它使代码更易读,尤其是语法高亮。 在我们最新的项目,虽然,我们使用的Checkstyle显示了用默认配置的警告public
接口方法上的修饰,所以我切换到ommitting他们。
所以,我真的不知道什么是最好的,但有一点我真的不喜欢的是使用public abstract
接口方法上。 Eclipse中“提取接口”重构时,有时会做到这一点。
我总是写什么,如果没有接口,我正在写一个直接执行,即,我会用我会用public
。
我宁愿跳过它,我读的地方,界面在默认情况下, public
和abstract
。
令我惊讶的书- Head First设计模式 ,是利用public
与接口的声明和接口的方法......这让我再次思考和我登陆了这个职位。
不管怎么说,我认为冗余信息应该被忽略。
之所以在默认情况下,公众和抽象为接口的方法似乎很合乎逻辑的和明显的给我。
在接口中的方法,它是默认的抽象强制实现类提供一个实现,是公众对默认设置,以便实现类访问这样做。
在代码中添加这些修饰语是多余的,无用的,只会导致你所欠缺的Java基础知识的掌握和/或理解的结论。
我不同意与流行的答案,即有公共意味着还有其他选择,所以它不应该存在。 事实是,现在与Java 9和更还有其他选择。
我认为不是Java应该强制执行/需要“公众”被指定。 为什么? 由于没有修改的意思是“包”访问其他地方,并且有这个作为一个特殊情况是什么导致了混乱。 如果简单地用一个明确的信息,使之成为编译错误(例如,“包访问不在接口允许的。”),我们将摆脱明显的模糊性使得具有选择离开了“公众”介绍。
注意目前的措辞为: https://docs.oracle.com/javase/specs/jls/se9/html/jls-9.html#jls-9.4
“在一个接口体的一种方法,可以声明公共或私有的 (6.6节)。如果没有访问修饰符,给出的方法是隐式公开的。这是允许的,但不鼓励作为一个风格问题,以冗余指定公共改性剂用于在界面的方法声明“。
看到“私人”现在是允许的。 我认为最后一句应该已经从JLS删除。 不幸的是,“隐公”的行为都不放过,因为这将很可能现在仍然是落后了兼容性和导致混乱,由于没有访问修饰符手段接口“公”和“包”的其他地方。
这完全是主观的。 我省略了多余的public
修饰符,因为它似乎是混乱。 正如其他人所说 - 一致性是关键,这个决定。
这是有趣的是C#语言设计者决定强制执行此。 声明的接口方法,在C#中的公共实际上是一个编译错误。 一致性可能不是跨语言重要的,所以我想这是不是真的直接关系到Java。
人们将学会从代码完成你的接口在他们的IDE或Javadoc中,而不是从阅读源。 所以这是在把“公共”源没有意义 - 没有人阅读源。