Что вы думаете о константах в области метода?

StackOverflow https://stackoverflow.com/questions/244191

  •  04-07-2019
  •  | 
  •  

Вопрос

Например:

public void doSomething() {

    final double MIN_INTEREST = 0.0;

    // ...  
}

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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 строк / 50 методов . Представьте себе опыт инженера, который пытается добавить новый метод с константой, ему придется 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top