Насколько я знаю, в C ++ полезно добавлять const
параметр для этих переменных, которые не собираются изменяться, и для этих методов, которые возвращают значения, например:
bool ExpenseManager::checkCategory(const string &userName, const string &categName) const{}
Мой вопрос: это хорошая практика для использования final
в Java так же, как const
в C ++ и объявить конкретные методы и / или переменные final
(как для значений, которые передаются в конструктор (public Something(final String haha)
)?
Обратите внимание, что объявление параметра final
в Java это деталь реализации в то время как const
параметр в C / C ++ изменяет сигнатуру метода! final
только означает, что переменная не изменится. Любой объект, на который ссылается переменная CAN, может измениться. Так, final
ничего не значит для вызывающего метода. В отличие от const
Параметр определяет контракт с вызывающей стороной: метод обещает, что он не изменит никаких данных, переданных через параметр. С Java вы не можете создать такой контракт, поэтому вы должны вернуться к неизменным объектам или защитным копиям.
Итак, вернемся к вашему вопросу: final
это деталь реализации, это не имеет значения при рассмотрении интерфейсов. Это скорее вопрос вкуса. Некоторые люди, особенно те, кто исходит из функционального языка, любят final
, поскольку они утверждают, что переменная должна быть изменчивой только тогда, когда она действительно мутирует где-то. Другим просто не нравится добавленное ключевое слово, которое добавляет визуальный шум.
Обычно это решение принимается на уровне проекта: либо использовать final
везде в проекте или нигде. Каждый разработчик проекта должен делать то же самое, иначе код будет выглядеть непоследовательным.
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;
}
});
}
Да, это. В Eclipse IDE есть настройки очистки кода, которые сделают это автоматически, хотя я использую его только для параметров метода.
Вы должны быть осторожны при использовании final
Ключевое слово в Java
1.Applying final
ключевое слово для переменных, в которых мы не можем переназначить значение переменной thet
2. Если метод объявлен как final
этот метод не может быть переопределен
3. Если класс объявлен как final
которые не могут быть расширены (ключевая выгода от наследования будет потеряна)
What i can say is Think before using `final` keyword
Объявление параметра метода как окончательного имеет следующие последствия:
Я проиллюстрирую это на следующем примере. Предположим, у меня есть класс для представления работника:
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 ++, который также останавливает метод от внесения каких-либо изменений в состояние передаваемого объекта / ссылки.