Передача переменной "const" в метод Java

Есть ли эквивалент в Java для передачи ссылок const в С++?
Не упускает ли "константу" заблуждение относительно подписи метода?

Ответ 1

Нет, нет.

Java "final" не является точным эквивалентом С++ "const" . Следующая следующая (отсроченная инициализация конечной переменной) работает в Java:

final double x;
int w = 1;
if (w > 2)
{
    x = 0.5;
}
else
{
    x = - 0.5;
}

но он не работает на С++, а "final" заменяется на "const" .

Использование "final" для переменной в объявлении метода может быть полезно в Java, поскольку позволяет использовать эту переменную внутри любого анонимного класса, созданного внутри вашего метода.

PS. Я был сначала разочарован отсутствием "const" на Java, но позже научился жить с "окончательным".

PS2. Глоссарий Java (http://mindprod.com/jgloss/immutable.html), связанный с этим потоком, имеет одну вещь: нет, вам не дано 100% гарантии, что окончательный переменная не меняет свое значение:

1) он изменяется от "undefined" до "определенного", но компилятор скажет вам, ссылаетесь ли вы на него перед инициализацией

2) в Linux, double имеет 80-битную точность при хранении в регистре, но 64-битный при сохранении в памяти. Когда окончательная двойная переменная вытесняется из регистра, она будет усечена и изменит ее значение. Как говорит Джоэл Спольский, "абстракция вызвала утечку".

Ответ 2

Java не имеет ничего подобного понятия С++ для const. Это точка зрения некоторых конкурентов, хотя интересно отметить, что .NET тоже. Я считаю, что причины:

  • Получение понятного синтаксиса становится довольно сложным (IMO) - говорить о различии между списком констант изменяемых StringBuilders и изменчивым списком const StringBuilders и т.д. сложно. (Я уверен, что это трудно в С++, хотя это может быть из-за отсутствия практики.)
  • Я сильно подозреваю, что было бы неприемлемо разрешить исключение константы в управляемых языках. Это противоречило бы всему этому. Во многих случаях это может усложнить работу.
  • Распространение информации о константе во время выполнения (во избежание ее исключения) может быть трудным и/или дорогостоящим в условиях производительности
  • Поскольку у Java (и .NET) в прошлом не было постоянной, введение в игру в конце игры чрезвычайно сложно - если все распространенные библиотеки не поддерживают его (и не ошибаюсь на каждом шагу!), вы в конечном итоге получаете неприятный mishmash, и действительно, он может быть совершенно неработоспособным, если вам нужно использовать две библиотеки, одна из которых не знает о константе, а другая - только значения const.

Ответ 3

BTW: Java имеет константу как ключевое слово, но вы не можете ее использовать в любом месте.

Ответ 5

Как и выше, в Java нет константы. Но когда мы хотим достичь "близкого" к тому же результату в Java, мы используем

public static final Object x = somedata;

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

Ответ 6

Ближайшим эквивалентом Java для const является final.

void func(final SomeClass x) {
  // The following causes a compiler error
  x = ...;

  // The following works. If you don't want it to, then you have to make
  // somevar final or write a getter (but not a setter) for it in SomeClass.
  x.somevar = ...;
}