【问题标题】:Java modifiers syntax and formatJava 修饰符语法和格式
【发布时间】:2023-03-16 11:23:01
【问题描述】:

我发现自己对访问和非访问修饰符的顺序感到困惑。例如

abstract void go()  
abstract public void go()  
public final void go()  
void final go()  

final class Test{}  
class final Test{}  
final abstract class Test{}  
abstract final Test{}  

我永远不知道正确的顺序是什么,有时我会弄错,因为有很多可能的组合。是否有一个明确的指南,哪个应该先于另一个?

是否有任何关于它们在代码中出现的格式和顺序的描述?我正在尝试提出一个语法指南,但我不确定它是否 100% 正确。这里是:

Methods:  
[access modifier | nonaccess modifier] return-type method-name  

Classes:  
[access modifier | nonaccess modifier] class class-name  

Interfaces:  
[access modifier | nonaccess modifier] interface interface-name       

Variables:  
[access modifier | nonaccess modifier] variable-type variale-name  

【问题讨论】:

  • 没有正确的顺序,所以不是一个真正的问题。

标签: java syntax coding-style


【解决方案1】:

来自Java编程语言(简体)官方grammar

Modifier:
  Annotation | public | protected | private
  static | abstract | final | native | synchronized
  transient | volatile | strictfp

ClassOrInterfaceDeclaration:
        {Modifier} (ClassDeclaration | InterfaceDeclaration)

ClassBodyDeclaration:
        {Modifier} MethodOrFieldDecl

MethodOrFieldDecl:
        Type Identifier MethodOrFieldRest

因此,对于类和接口,修饰符必须始终出现在 class 关键字之前,并且顺序不限。例如,final public class 有效,但 class final 无效。方法和字段都是一样的,但是修饰符必须出现在类型之前。

【讨论】:

【解决方案2】:

http://checkstyle.sourceforge.net/config_modifier.html

正确的(或者更确切地说,传统的)顺序是:

  1. 公开
  2. 受保护
  3. 私人
  4. 摘要
  5. 静态
  6. 最终
  7. 瞬态
  8. 易变
  9. 同步
  10. 原生
  11. strictfp

在使用 Java 编程几天后,您应该会自然而然地想到这个顺序。

【讨论】:

    【解决方案3】:

    就像在英语中一样,形容词(诸如publicstaticvolatile 等修饰语)在它们所描述的名词之前(classinterface 或任何类型,例如@987654326 @ 或 String)。修饰符的顺序与语言无关,但通过阅读代码,您会很快发现哪个感觉更自然。

    【讨论】:

      【解决方案4】:

      修饰符位于class 或类型之前。根据JavaLanguageSpecification,修饰符之间的顺序无关紧要。

      【讨论】:

        【解决方案5】:

        是的,有Java Language Specification,它解释了语言中所有有效的语法,还有coding conventions used by Oracle/Sun,它有点旧,但仍然解释了很多东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-20
          • 1970-01-01
          • 2013-12-01
          • 1970-01-01
          • 2023-03-31
          相关资源
          最近更新 更多