Передача переменной «const» в метод в Java - PullRequest
11 голосов
/ 02 февраля 2009

Есть ли в Java эквивалент передачи константных ссылок в C ++?
Не исключает ли вводная заблуждение в отношении сигнатуры метода?

Ответы [ 6 ]

15 голосов
/ 02 февраля 2009

Нет, нет.

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

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

но это не работает в C ++ с заменой «final» на «const».

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

PS. Сначала я был разочарован отсутствием «const» в Java, но позже научился жить с «final».

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

1) он изменяется с «неопределенного» на «определенный», но компилятор сообщит вам, если вы ссылаетесь на него перед инициализацией

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

8 голосов
/ 02 февраля 2009

Java не имеет ничего общего с понятием const в C ++. Это спорный вопрос, хотя интересно отметить, что .NET тоже нет. Я считаю, что причины:

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

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

1 голос
/ 02 февраля 2009

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

public static final Object x = somedata;

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

1 голос
/ 02 февраля 2009

Смотрите это для достижения этого в Java: Неизменяемые объекты в Java

0 голосов
/ 02 февраля 2009

Ближайший 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 = ...;
}
...