Что вы думаете о методах с константами? - PullRequest
27 голосов
/ 28 октября 2008

Например:

public void doSomething() {

    final double MIN_INTEREST = 0.0;

    // ...  
}

Лично я бы предпочел, чтобы эти константы замещения объявлялись статически на уровне класса. Полагаю, я ищу «отраслевую точку зрения» по этому вопросу.

Ответы [ 7 ]

33 голосов
/ 28 октября 2008

Я думаю, вы должны размещать их на уровне класса, только если они используются несколькими методами. Если он используется только в этом методе, то это выглядит хорошо для меня.

18 голосов
/ 28 октября 2008

Моя начальная позиция заключается в том, что каждая переменная или константа должна быть объявлена ​​/ инициализирована как можно ближе к ее первому использованию, насколько это возможно / практически (т.е. не разбивать логический блок кода пополам, просто чтобы объявить несколько строк ближе) и ограничен настолько плотно, насколько это возможно. - Если вы не можете дать мне чертовски вескую причину, почему все должно быть иначе.

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

В примере, который вы привели в вопросе, я бы сказал, что MIN_INTEREST - это, вероятно, одна из тех частей информации, которую пользователь хотел бы получить в свои руки, и она должна охватывать класс, а не метод. (Хотя в примере кода нет контекста, и моё предположение может быть совершенно неверным.)

9 голосов
/ 07 ноября 2008

Технически, в Java нет такой вещи, как «константа метода». То, на что вы ссылаетесь, является просто конечной локальной переменной; он создается уничтоженным с каждым вызовом метода.

http://www.java -tips.org / Java-се-советы / java.lang / как-делать-я-DECLARE-а-постоянная-в-java.html

3 голосов
/ 28 октября 2008

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

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

3 голосов
/ 28 октября 2008

Я сам использовал этот метод для определения констант, но время от времени коллеги отключают его при проверке кода. Опять же, эти коллеги не занимаются чтением / записью с открытым исходным кодом, но они используются для корпоративного программного обеспечения.

Я говорю им, что не имеет смысла использовать константу уровня класса, если она используется в одном методе, но я обнаружил, что более одного коллеги настаивают на ее перемещении вверх. Я обычно подчиняюсь, так как я не такой жесткий, если это не влияет на читабельность и / или производительность.

1 голос
/ 25 февраля 2017

У меня есть другое мнение: ИМХО, лучше разместить их в области видимости файлов / классов, особенно если вы работаете в команде по этой причине: скажем, вы начинаете с небольшого фрагмента кода ...

public void doSomething() {

  final double MIN_INTEREST = 0.0;

  // ...  
}

и другие члены вашей команды расширяют класс целой кучей методов, и теперь этот класс - замечательный 500 lines / 50 methods гигантский класс. Представьте себе опыт инженера, который пытается добавить новый метод с константой, им придется 1 сканировать весь класс в поисках констант, соответствующих их потребностям, 2 перемещать константу в область видимости класса, надеясь, что есть не конфликтует с существующим кодом и 3 также добавляет их метод.

Если вместо этого вы сначала добавите все константы в область действия файла / класса, у инженеров будет 1 единственное место для поиска существующих констант и 2 будет выводить некоторые константы из других, где это имеет смысл. (например, если у вас есть константа для pi, вы также можете определить новую константу со значением pi/2).

0 голосов
/ 28 октября 2008

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

Пример:

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

Так что твой вопрос не имеет никакого смысла.

...