Каков разумный порядок модификаторов Java (абстрактный, окончательный, общедоступный, статический и т. Д.)?

115

Каков разумный порядок модификаторов Java?

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

Обновить

Я изменил формулировку с рекомендуемой на разумную , чтобы успокоить дискуссии о том, рекомендуется ли порядок или нет.

Миха Виденманн
источник
Это не имеет ни малейшего значения, и не стоит тратить слишком много времени на то, чтобы мучиться по этому поводу. Лично я всегда сначала ставлю модификатор доступа, но после этого я даже не могу сказать вам, что буду делать дальше. Если вам нужна ссылка, попробуйте здесь , но я не уверен, что она там вообще указана.
Маркиз Лорн,
9
Интересно, почему это должен быть «неконструктивный» вопрос (закрытые запросы). Вы можете найти рекомендацию в спецификации (см. Мой ответ), и следование этой рекомендации улучшит читаемость кода. Статический анализатор кода (например, SONAR) пожалуется, если вы используете другой порядок.
FrVaBe
Я сделал еще один взгляд на конвенции Oracle / Sun Java кода . Этот вопрос даже не упоминается в одном месте, куда вы должны смотреть, и в одном месте, где вы ожидаете его появления.
Маркиз Лорн,
@EJB Соглашения по коду относятся к 1999 году и настоятельно нуждаются в обновлении. Я надеюсь, что они включат эту тему, если когда-нибудь снова коснутся этих конвенций, потому что это действительно хорошее место!
FrVaBe
1
Может ли Eclipse автоматически сортировать модификаторы? Или хотя бы предупредить, если они не отсортированы?
Роланд

Ответы:

126

Обычный порядок применения модификаторов упоминаются в спецификации языка Java (а не в Спецификации Java Virtual Machine) , например , для класса модификаторов вы найдете следующее определение (экстракт):

ClassModifiers:
    ClassModifier
    ClassModifiers ClassModifier

ClassModifier: one of
    Annotation public protected private
    abstract static final strictfp

[....]

Если два или более (разных) модификатора класса появляются в объявлении класса, то обычно, хотя и не требуется, они появляются в порядке, соответствующем тому, который показан выше в производстве для ClassModifier. (маленький текст внизу абзаца!)

Вы найдете это предложение в нескольких других местах, где указано использование модификаторов, например, здесь для модификаторов полей.

Обновление : я заменил «указано / рекомендовано» на «обычное», чтобы сделать этот ответ приемлемым. Учтите это, если читаете комментарии ;-) (спасибо @EJP, чтобы прояснить это) - Тем не менее, я бы рекомендовал использовать обычный порядок.

Google также рекомендует использовать обычный порядок, указанный в спецификации Java.

public / protected / private 
abstract 
static 
final 
transient 
volatile 
synchronized 
native 
strictfp

Обновление : существует новаяинициатива « Руководства по стилю Java » для проектов в сообществе OpenJDK. Он также содержит рекомендации по порядку модификаторов, а также включает новыймодификатор по умолчанию Java 8.

public / private / protected
abstract
static
final
transient
volatile
**default**
synchronized
native
strictfp
FrVaBe
источник
1
Возник вопрос: «Каков рекомендуемый порядок модификаторов Java?» Ответы на эти вопросы содержатся в Спецификации языка (и поскольку порядок не требуется, я бы сказал, что он рекомендован в спецификации). Спецификация JVM касается формата файла класса, а не исходного кода Java. - На самом деле порядок не имеет значения, но если вы последуете рекомендации, ваш код будет более читабельным для других. Так что я думаю, что это разумный вопрос, на который можно дать точный ответ. Кстати, статический анализатор кода (например, SONAR) пожалуется на неправильный порядок.
FrVaBe
3
Предложение Если два или более (различных) модификатора класса появляются в объявлении класса, то обычно, хотя и не требуется, они появляются в порядке, соответствующем тому, который показан выше в продукте ClassModifier. ВХОДИТ В СПЕЦИФИКАЦИЮ!
FrVaBe
1
В этом случае я хотел закричать, но уже успокоился - извините ;-) - я тоже не родной - так что вы, наверное, правы в переводе на язык. В своем ответе я просто хотел сказать, что существует очень официальное место, где обрабатывается порядок модификаторов в исходном коде Java - и мне посчастливилось найти его, когда я задал себе тот же вопрос. ИМХО нет лучшего места, чтобы найти ответ, чем в Спецификации языка Java.
FrVaBe
1
@EJP У вас твердое мнение (~ нет рекомендованного порядка) по этой теме. Не могли бы вы дать это в качестве ответа? Мне интересно узнать о голосовании.
FrVaBe
28

Разумно использовать порядок в соответствии со спецификацией виртуальной машины Java, таблица 4.4.

  • общественный
  • защищенный
  • частный
  • Аннотация
  • дефолт
  • статический
  • окончательный
  • преходящий
  • летучий
  • синхронизированный
  • родной
  • strictfp
Миха Виденманн
источник
8
+1 вы видите часто: «общественность аннотация», «частный статический финал» и т.д. Некоторые Иды (например , NetBeans) , даже есть некоторые ярлыки, например «PSF» или «Psf»
Puce
1
Вы можете найти рекомендуемый порядок в Спецификации языка Java (а не в Спецификации виртуальной машины Java!). Посмотри на мой ответ.
FrVaBe
1
@FrVaBe Ничего подобного не найти. Не путайте языковую грамматику с рекомендациями по стилю.
Маркиз Лорн,
@Puce: некоторые IDE (например, IntelliJ IDEA) даже могут правильно сортировать модификаторы.
Mot
5

На основе их значений int.

Модификатор (Java Platform SE 8)

  • 1: общественный
  • 2: частный
  • 4: защищенный
  • 8: статический
  • 16: финал
  • 32: синхронизировано
  • 64: летучий
  • 128: переходный
  • 256: родной
  • 512: интерфейс
  • 1024: абстрактный
  • 2048: строгий фп
Серо
источник
1
этот ответ не включает ключевое слово "default"
Серо,
1
При чем здесь их значения int?
Marquis of Lorne
0

Я использую два правила, чтобы запомнить последовательность модификаторов, но не включаю strictfp, поскольку он никогда не использовался мной. FYI.

  1. синхронизированные родные - наименее приоритетные люди.

  2. PPP AS FTV: PPP {шум звука} КАК {смотрят} FTV {France TV}.

:)

Houcheng
источник