Java中的修饰符关键字顺序

Posted

技术标签:

【中文标题】Java中的修饰符关键字顺序【英文标题】:Modifier Keyword order in Java 【发布时间】:2012-05-05 03:47:30 【问题描述】:

每次我在 Java 中使用比public void 更多的关键字编写方法时,每次我都以另一种方式编写它。有时是“static public void”有时是“public static void”等等。

这些关键字的最佳顺序(最佳做法)是什么?

[abstract/static] [final] [synchronized] [public/private/protected] [result_type] ???

【问题讨论】:

听起来像是我的一个问题,被引导到programmers.stackexchange.com...但我个人使用[public/private/protected] [final/abstract/static] [synchronized] [type] func()... 【参考方案1】:

理论上讲 public static final 还是 final static public 都没有关系,但是如果你遵循通常的约定,其他人将能够更容易地阅读你的代码。这是首选顺序:

[公开|受保护 |私人]

静态

抽象

同步

[瞬态|易变]

最终

原生

严格的

[ 整数 |长 |字符串 |班级 |枚举 |接口等]

【讨论】:

@YoushaAleayoub 在提供的 JLS 部分,它没有说明任何关于订单限制的内容,例如 It is compile time error, if you do not follow above order. :) 我认为静态和抽象的顺序是根据docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.3交换的。要去编辑它.. @11thHourWorker:考虑到staticabstract 不能同时出现在一个声明中,它们的相互顺序无关紧要。 @Joey, class Outer static abstract class Inner @MikeSamuel:啊,好点子。我在 C# 中花了太多时间来记住这些怪癖;-)(我不记得曾经有一个抽象的静态内部类......)【参考方案2】:

Checkstyle(它实现了 Java 语言规范部分的建议,8.1.1、8.3.1 和 8.4.3)说:

    公开 受保护 私人 摘要 默认 静态 最终 瞬态 易变 同步 原生 strictfp

【讨论】:

1.-3。永远不可能同时出现,所以它们应该放在首位。 @KonradHöffner,不,这样更清楚。尽管技术性很强,但我希望有一个列表,我可以在视觉上只在一个维度上进行选择。你不能拥有,比如说,public protected 的事实是没有实际意义的。这是关于整体排序,不是关于允许一起使用的内容。明智的配对是针对语言的 BNF(等),而不是这个问题。【参考方案3】:

Java Language Specification 中提到了修饰符的自定义使用顺序(因此无需有自己的意见;-))例如对于method modifiers,您将找到以下定义(摘录):

MethodModifiers:
    MethodModifier
    MethodModifiers MethodModifier

MethodModifier: one of
    Annotation public protected private abstract
    static final synchronized native strictfp

如果两个或多个(不同的)方法修饰符出现在方法声明中,尽管不是必需的,但习惯上它们的出现顺序与上面 MethodModifier 产生式中显示的顺序一致。

您会在其他几个指定使用修饰符的地方找到这句话,例如here 用于字段修饰符。

(这主要是从我的另一个答案here复制而来)。

【讨论】:

【参考方案4】:

“最好的”是遵循Java Coding Style Guide,在 6.2(方法声明)中声明:

public static final synchronized long methodName()
    throws ArithmeticException, InterruptedException 
    static int count;

【讨论】:

链接目前没有指向有用的页面,只是指向 oracle 的 java 主页。 @CoatedMoose 修复了链接【参考方案5】:

最好的顺序是其余代码使用的顺序。

【讨论】:

是的,但你不能否认public static finalpublic final static 更常见。有一些不成文的约定。 确实,Javaland 中有一些非常明确的约定,例如带有 infixCaps 风格的命名方法。值得学习和关注。 很多代码都是团队开发的。所以,请遵守官方约定。【参考方案6】:

像这样:

public static final synchronized void calculate()

【讨论】:

public static final synchronized void calculate() ;-)【参考方案7】:

是的,有一个标准的排序。

如果您使用 IDE,您可以设置它来为您格式化代码,即在 Eclipse 中的 Preferences -> Java -> Editor -> Save Actions 中,您可以选中“Format source code”框

那你就不用再担心了。只要文件被保存,它就会自动完成,如果你的整个项目都使用它,那么整个项目的代码都以相同的方式格式化。

【讨论】:

这不会重新排序修饰符 AFAIK。见bugs.eclipse.org/bugs/show_bug.cgi?id=322494【参考方案8】:

这是我个人的选择

public static final void method()  
public void method()  
public abstract void method()  

这似乎也符合 java 文档

【讨论】:

以上是关于Java中的修饰符关键字顺序的主要内容,如果未能解决你的问题,请参考以下文章

Java常用的修饰符关键字

JAVA中的四种作用域访问修饰符以及各自的关键字个特点是?

什么叫final修饰符?有什么作用?

Java中带有抽象方法签名的可见性修饰符

java修饰符

Java中的四种权限修饰符