Синтаксис и формат модификаторов Java - PullRequest
12 голосов
/ 13 августа 2011

Меня смущает вопрос о порядке доступа и модификаторах без доступа.Например,

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  

Ответы [ 5 ]

18 голосов
/ 13 августа 2011

Из официального грамматика языка программирования 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 - нет. Для методов и полей то же самое, но модификаторы должны появляться перед типом.

12 голосов
/ 13 августа 2011

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

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

  1. 1007 * общественное *
  2. 1009 * защищен *
  3. частный
  4. аннотация
  5. статические
  6. окончательный
  7. переходная
  8. 1021 * летучий *
  9. синхронизируется
  10. родной
  11. strictfp

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

3 голосов
/ 14 августа 2011

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

2 голосов
/ 13 августа 2011

Да, есть Спецификация языка Java , которая объясняет все, что является допустимым синтаксисом в языке, и есть также соглашения о кодировании, используемые Oracle / Sun , что немногостарый, но все еще многое объясняет.

2 голосов
/ 13 августа 2011

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

...