Подтвердить что ты не робот

Эквивалент const (С++) в Java

Мне было интересно, был ли эквивалент С++ const в Java. Я понимаю последнее ключевое слово, но, к сожалению, я не могу использовать это, чтобы объявить возвращаемые значения функций final. Вместо этого он всегда гарантирует, что функция не может быть переопределена, правильно?

В принципе, я хочу убедиться, что данный возвращенный класс не может быть изменен и доступен только для чтения. Возможно ли это на Java?

4b9b3361

Ответ 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 (но не используется)

Дизайнеры, вероятно, подумали, что эта функция действительно раздражает и не очень полезна. У меня было это чувство, когда я был С++-кодером. Определенная статическая проверка слишком велика.