Есть ли эквивалент в Java для передачи ссылок const в С++?
Не упускает ли "константу" заблуждение относительно подписи метода?
Передача переменной "const" в метод Java
Ответ 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 имеет константу как ключевое слово, но вы не можете ее использовать в любом месте.
Ответ 4
Смотрите это для достижения этой цели в Java: Неизменяемые объекты в 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 = ...;
}