Правильно использовать последний параметр в Java

Насколько я знаю, в C ++ полезно добавлять const параметр для этих переменных, которые не собираются изменяться, и для этих методов, которые возвращают значения, например:

bool ExpenseManager::checkCategory(const string &userName, const string &categName) const{}

Мой вопрос: это хорошая практика для использования final в Java так же, как const в C ++ и объявить конкретные методы и / или переменные final (как для значений, которые передаются в конструктор (public Something(final String haha))?

-1

Решение

Обратите внимание, что объявление параметра final в Java это деталь реализации в то время как const параметр в C / C ++ изменяет сигнатуру метода! final только означает, что переменная не изменится. Любой объект, на который ссылается переменная CAN, может измениться. Так, final ничего не значит для вызывающего метода. В отличие от const Параметр определяет контракт с вызывающей стороной: метод обещает, что он не изменит никаких данных, переданных через параметр. С Java вы не можете создать такой контракт, поэтому вы должны вернуться к неизменным объектам или защитным копиям.

Итак, вернемся к вашему вопросу: final это деталь реализации, это не имеет значения при рассмотрении интерфейсов. Это скорее вопрос вкуса. Некоторые люди, особенно те, кто исходит из функционального языка, любят final, поскольку они утверждают, что переменная должна быть изменчивой только тогда, когда она действительно мутирует где-то. Другим просто не нравится добавленное ключевое слово, которое добавляет визуальный шум.

Обычно это решение принимается на уровне проекта: либо использовать final везде в проекте или нигде. Каждый разработчик проекта должен делать то же самое, иначе код будет выглядеть непоследовательным.

6

Другие решения

final Ключевое слово имеет разные значения при использовании в методах и параметрах метода.

  • Находясь в методе, это означает, что этот метод не может быть переопределен.
  • Когда на параметре метода, это означает, что метод не может
    изменить значение этого параметра в его теле.

РЕДАКТИРОВАТЬ:

В некоторых случаях компилятор заставляет вас объявить их окончательными. Вот один из таких примеров (это типичный код DAO). Поэтому люди обычно делают это только тогда, когда компилятор заставляет их это делать.

public List<Process> getProcesses(final Integer uid, final String status) {
return getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
StringBuilder sbQuery = new StringBuilder
("select * from [process] where [uid] = :u and [status] = :s");

SQLQuery query = session.createSQLQuery(sbQuery.toString());

query.addEntity(Process.class);

query.setParameter("u", uid);
query.setParameter("s", status);

List l = query.list();
return (List<Process>)l;
}
});
}
1

Да, это. В Eclipse IDE есть настройки очистки кода, которые сделают это автоматически, хотя я использую его только для параметров метода.

0

Вы должны быть осторожны при использовании final Ключевое слово в Java

1.Applying final ключевое слово для переменных, в которых мы не можем переназначить значение переменной thet

2. Если метод объявлен как final этот метод не может быть переопределен

3. Если класс объявлен как final которые не могут быть расширены (ключевая выгода от наследования будет потеряна)

   What i can say is Think before using `final` keyword
0

Объявление параметра метода как окончательного имеет следующие последствия:

  • Метод не могу измените параметр метода, чтобы он указывал на другую ссылку.
  • Метод МОЖНО изменить параметр метода, т.е. изменить состояние объекта, на который ссылается параметр (изменить переменные экземпляра)

Я проиллюстрирую это на следующем примере. Предположим, у меня есть класс для представления работника:

class Employee
{
public String name;
public Integer id;
}

Случай 1 :

  public void test(final Employee emp)
{
emp = new Employee(); //Invalid since you are changing the reference
}

Случай 2:

   public void test(final Employee emp)
{
emp.name = "John Doe"; //Valid
}

Это отличается от параметра const в C ++, который также останавливает метод от внесения каких-либо изменений в состояние передаваемого объекта / ссылки.

0
По вопросам рекламы [email protected]