Подтвердить что ты не робот

Каковы ваши мысли о константах, связанных с методом?

Например:

public void doSomething() {

    final double MIN_INTEREST = 0.0;

    // ...  
}

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

http://www.java-tips.org/java-se-tips/java.lang/how-do-i-declare-a-constant-in-java.html

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

Пример:

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

Итак, ваш вопрос не имеет никакого смысла.

Ответ 7

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

public void doSomething() {

  final double MIN_INTEREST = 0.0;

  // ...  
}

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

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