Рубрики
Без рубрики

Странный синтаксис Java

Вы когда-нибудь видели подобный код? public int получить содержимое ящика с добычей(int lootBoxIdx)[] { // ЗАДАЧА:… Помеченный java, синтаксисом, массивом.

Вы когда-нибудь видели подобный код?

public int getLootBoxContents(int lootBoxIdx)[] {
    // TODO: get loot
    return null;
}

Если вы не будете смотреть внимательно, вы действительно можете пропустить это 😏

“Подождите, что эти [] делают в конце объявления метода? Вы не можете возвращать null для int , поэтому возвращаемый тип должен быть int[] верно?”

Да, вы правы, и я действительно надеюсь, что вы не видели этот синтаксис в производственном коде. Теперь, помимо того, что это мир знаний о мелочах, которые вы можете использовать, чтобы произвести впечатление на своих таких же занудных друзей в баре, реальный вопрос заключается в том, почему это разрешено? Куда бы мы ни посмотрели, в каждом руководстве, которое мы видим, мы бы объявили сигнатуру метода как

public int[] getLootBoxContents(int lootBoxIdx)

и нет

public int getLootBoxContents(int lootBoxIdx)[]

Синтаксически похожие языки, такие как C #, также не допускают этого, так что же это дает?

Если вы увидите этот код в всегда удобном IntelliJ, он даст вам подсказку о его происхождении:

C-style array declaration of the return type of method 'lootBoxContents()' 

Для тех из вас, кто не писал код на C, в C (также C++) массивы не являются гражданами первого класса в языке, что означает, что они не могут использоваться в качестве возвращаемого типа функции. Вместо этого мы делаем в C возврат указателя на массив следующим образом:

int* getLootBoxContents(int lootBoxIdx)

и если мы хотим вернуть массив фиксированного размера, мы используем

int (&getLootBoxContents(int lootBoxIdx))[5] // each loot box must be an array of size 5

Хорошо, второй вариант очень похож на то, что у нас есть, и мы знаем, что Java взаимодействует с C с помощью волшебного native ключевое слово. Тем не менее, это чистая Java, а не какие-то махинации с Java на C, так почему же разрешен синтаксис?

Давайте рассмотрим другой пример, который более знаком разработчикам.

int[] array;
int array[];

Объявления в двух строках выше эквивалентны в соответствии со спецификацией java .

The precise array type depends on the bracket pairs that may appear as part of the type at the beginning of the method declaration, or after the method's formal parameter list, or both.
...
We do not recommend "mixed notation" in array variable declarations, where bracket pairs appear on both the type and in declarators; nor in method declarations, where bracket pairs appear both before and after the formal parameter list.

Или, проще говоря, даже разработчики языка советуют нам всегда отдавать предпочтение int[] array .

Теперь интересный фрагмент из той же спецификации::

Brackets are allowed in declarators as a nod to the tradition of C and C++.

И вот у нас есть наш ответ и это не просто кивок, как было сказано. Если мы вернемся во времени к зарождению Java, доминирующими языками в то время были C и C++, поэтому эта синтаксическая функция также была добавлена в язык, чтобы помочь разработчикам C/C ++ в их переходе к написанию Java. Действительно ли это помогло в этом … крайне маловероятно, но все же это часть языка, которая никогда не исчезнет, и приятный мир истории языка программирования.

Оригинал: “https://dev.to/a2triple/java-s-strange-bit-of-syntax-5c75”