Что вы думаете о методах с константами?
Например:
public void doSomething() {
final double MIN_INTEREST = 0.0;
// ...
}
Лично я бы предпочел, чтобы эти константы замещения объявлялись статически на уровне класса. Я полагаю, что я ищу "точку зрения отрасли" по этому вопросу.
7 ответов
Моя начальная позиция заключается в том, что каждая переменная или константа должна быть объявлена / инициализирована как можно ближе к ее первому использованию, насколько это возможно / практически (т.е. не разбивать логический блок кода пополам, просто для объявления нескольких строк ближе), и иметь вид плотно, насколько это возможно. - Если только ты не можешь дать мне чертовски вескую причину, почему все должно быть иначе.
Например, финальная область метода не будет видна в публичном API. Иногда эта часть информации может оказаться полезной для пользователей вашего класса и должна быть перемещена вверх.
В примере, который вы привели в вопросе, я бы сказал, что MIN_INTEREST - это, вероятно, одна из тех частей информации, которую пользователь хотел бы получить в свои руки, и она должна охватывать класс, а не метод. (Хотя в примере кода нет контекста, и моё предположение может быть совершенно неверным.)
Я думаю, что вы должны поместить их только на уровне класса, если они используются несколькими методами. Если он используется только в этом методе, то это выглядит хорошо для меня.
Технически, в Java нет такой вещи, как "константа области действия метода". То, на что вы ссылаетесь, является просто конечной локальной переменной; он создается уничтоженным с каждым вызовом метода.
http://www.java-tips.org/java-se-tips/java.lang/how-do-i-declare-a-constant-in-java.html
Я сам использовал этот метод с заданными константами, но каждый раз коллега отключает его при проверке кода. Опять же, эти коллеги не занимаются чтением / записью с открытым исходным кодом, а используются для корпоративного программного обеспечения.
Я говорю им, что не имеет смысла использовать константу уровня класса, если она используется в одном методе, но я обнаружил, что более одного коллеги настаивают на ее перемещении вверх. Я обычно подчиняюсь, так как я не такой жесткий, если это не влияет на читабельность и / или производительность.
Сокрытие информации и модульность являются ключевыми принципами, а узкий охват лучше скрывать информацию. Если константа нужна только методу, сокрытие хорошо. Если и когда константа полезна в другом месте, выведите ее в более широкую область, но только настолько широко, насколько это необходимо.
Вы, вероятно, обеспокоены тем, что это константа, и, следовательно, может показаться, что она принадлежит некоторой глобальной таблице свойств. Может быть, это так. Может быть, это не так. Ваше беспокойство справедливо, но нет единого лучшего места для всех констант.
У меня есть другое мнение на этот счет: IMHO, лучше поместить их в область видимости файла / класса, особенно если вы работаете в команде по этой причине: скажем, вы начинаете с небольшого фрагмента кода...
public void doSomething() {
final double MIN_INTEREST = 0.0;
// ...
}
и другие члены вашей команды расширяют класс целой кучей методов, и теперь этот класс замечательный 500 lines
/50 methods
гигантский класс. Представьте себе опыт инженера, который пытается добавить новый метод с константой, им придется 1
сканировать весь класс в поисках констант, соответствующих их потребностям, 2
переместить константу в область видимости класса, надеясь, что нет конфликтов с существующим кодом и 3
также добавьте их метод.
Если вместо этого вы добавите все константы в область видимости файла / класса, инженеры 1
единственное место для поиска существующих констант и, 2
получить некоторые константы от других, где это имеет смысл. (например, если у вас есть константа для pi
Вы также можете определить новую константу со значением pi/2
).
Причина, по которой вы можете определить конечную переменную на уровне класса или метода (локального), заключается в том, что вы можете переопределить глобальную статическую константу внутри (локального) метода.
Пример:
public class Test {
final double MIN_INTEREST = 0.0;
/**
* @param args
*/
public static void main(String[] args) {
Test test = new Test();
test.doSomethingLocal();
test.doSomethingGlobal();
}
public void doSomethingGlobal() {
System.out.println("Global-> " + MIN_INTEREST);
}
public void doSomethingLocal() {
final double MIN_INTEREST = 0.1;
System.out.println("Local-> " + MIN_INTEREST);
}
}
Выход будет:
Local-> 0.1
Global-> 0.0
Так что твой вопрос не имеет никакого смысла.