Синтаксис и формат синтаксиса Java

Я смущаюсь в отношении порядка модификаций доступа и не-доступа. Например

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  

Ответ 1

Из официальной грамматики языка программирования Java (упрощенного):

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.

Правильный (или, скорее, обычный) порядок:

  • общественности
  • защищенный
  • частным
  • абстрактный
  • статичным
  • конечная
  • переходная
  • летучий
  • синхронизированы
  • родной
  • strictfp

Этот порядок должен прийти к вам в голову после нескольких дней программирования на Java.

Ответ 3

Как и на английском языке, прилагательные (модификаторы, такие как public, static, volatile и т.д.) предшествуют имени, которое они описывают (class, interface, или любой тип, например int или String). Порядок модификаторов не имеет значения для языка, но, читая код, вы быстро обнаружите, что кажется более естественным.

Ответ 4

Модификаторы идут до class или типа. Согласно Java Язык Спецификация, порядок между модификаторами не имеет значения.