Эквивалент const (С++) в Java
Мне было интересно, был ли эквивалент С++ const в Java. Я понимаю последнее ключевое слово, но, к сожалению, я не могу использовать это, чтобы объявить возвращаемые значения функций final. Вместо этого он всегда гарантирует, что функция не может быть переопределена, правильно?
В принципе, я хочу убедиться, что данный возвращенный класс не может быть изменен и доступен только для чтения. Возможно ли это на Java?
Ответы
Ответ 1
В принципе, я хочу убедиться, что данный возвращенный класс не может быть изменен и доступен только для чтения. Возможно ли это на Java?
Не напрямую, но одно обходное решение - это неизменный объект.
Пример -
public final Foo{
private final String s;
public Foo(String s){
this.s = s;
}
// Only provide an accessor!
public String getString(){
return s;
}
}
Ответ 2
Java не поддерживает const-квалификацию ссылок на объекты.
Временные решения включают следующее:
- Неизменяемые объекты.
- Немодифицируемые представления модифицируемых объектов (например, те, которые возвращены Collections.unmodifiable *()).
- Типы интерфейса только для чтения
- Оборонительные копии.
Неизменяемые объекты предотвращают модификацию получателя, но также предотвращают модификацию с помощью любой ссылки. Они не эквивалентны указателям/ссылкам на константу С++.
Ближайшие типы интерфейса только для чтения. Вы можете сопоставить const-правильный класс С++ с двумя Java-модулями, один - с интерфейсом только с определенными методом const.
Это иногда полезно, чтобы контролировать, что может изменить экземпляр класса. Однако это делается не так часто, как в С++.
Ответ 3
"Конечное" ключевое слово означает const. Но использование final в java сильно отличается от С++
Только поля или локальные переменные могут быть окончательными.
Последний класс не является классом const, а закрытым классом, который не может быть унаследован.
Последний метод - это закрытый метод, метод, который нельзя переопределить.
В С++ существует понятие "const type", но в java у вас есть только понятие const-типа, метод const (не-overridable) и const-класс (не наследуемый).
Ответ 4
Нет
Java не поддерживает концепцию константы, поскольку C/С++ ее использует.
Явный эквивалент этому классу Foo не может быть записан.
class Foo
{
public:
std::vector<Bar>& bars( void ) const
{ return m_bars; }
private:
std::vector<Bar> m_bars;
};
Однако у Java есть другой подход, используя интерфейсы.
class Foo
{
public:
ReadonlyList<Bar> bars( )
{ return m_bars; }
private:
ArrayList<Bar> m_bars;
};
Java final
ключевое слово больше похоже на Foo * const
, чем любая другая концепция С++. Обратите внимание, что Foo const*
очень распространен и полезен, а Foo * const
меньше.
Ответ 5
Я думаю, вам нужен неизменный объект. Объект считается неизменным, если его состояние не может измениться после его построения.
Для этого вам нужно
- гарантировать, что класс нельзя переопределить - сделать класс окончательным или использовать статические фабрики и сохранить конструкторы private
- сделать поля частными и конечными вызывающими силами для создания объекта полностью за один шаг, вместо использования конструктора без аргументов в сочетании с последующими вызовами методов setXXX
-
не предоставляют никаких методов, которые могут каким-либо образом изменить состояние объекта - не только методы setXXX, но и любой метод, который может изменить состояние.
публичный конечный класс SomeThing {
public Something(String name) {
fname=name
}
private final String fName;
public String getName() {
return fName;
}
}
Ответ 6
Java специально отбросила некоторые функции С++, const является одним из них. Это сознательное решение может быть отражено тем фактом, что const
является зарезервированным словом в Java (но не используется)
Дизайнеры, вероятно, подумали, что эта функция действительно раздражает и не очень полезна. У меня было это чувство, когда я был С++-кодером. Определенная статическая проверка слишком велика.