4

Имеет ли смысл скрывать public static final константы и делать геттер либо нет?

Вышел небольшой спор... Спасибо! :)

  • вот такие вот вопросы и затевают нешуточные холивары в инете...) – Stas0n Mar 18 '13 at 14:22

4 Answers4

7

Универсальное правило ровно одно: следуйте семантике, смыслу кода.

Если вы экспортируете константу, смело выставляйте наружу public static final. Например:

class GlobalConstants
{
    public static final int DAYS_IN_WEEK = 7;
}

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

class MyCar
{
    private static final String manufacturerName = "ЗАЗ";
    public String getManufacturer()
    {
        return manufacturerName;
    }
}

Если завтра вы пересядете на "Феррари", у клиентов, которые скомпилировались со старой версией вашей библиотеки, не будет проблем. (А вот если бы ваша строка была константой, она оказалась бы жёстко вкомпилированной в код клиентов, и они бы продолжали считать, что вы ездите на "Запорожце".)


Подобный вопрос для C# уже обсуждался на сайте.

VladD
  • 206,799
  • 1
    вы должно быть имели в виду:
    public static final int DAYS_IN_WEEK = 7;
    
    – jmu Mar 18 '13 at 17:22
  • @jmu: угу, вы правы, заменю, спасибо. Java не мой родной язык. – VladD Mar 18 '13 at 17:42
1

Нет никакого смысла. Поле то никак не поменяется - оно же final. Оно public - то есть уже доступное. Более того, вносить дополнительную прослойку - это только для адептов полного ООП.

Если не согласны, то подумайте над вопросом - а следует ли делать для этих полей setter'ы (это вопрос с большой долей иронии).

KoVadim
  • 112,121
  • 6
  • 94
  • 160
1

Я понимаю вопрос так: имеет ли смысл скрывать static final, ибо скрывать public static final нет никакого смысла - это точно.

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

Есть серия классов (иерархия), где каждый из классов оперирует понятием размер блока (речь идет о блочном шифровании). Коню понятно, что размер блока зависит от алгоритма шифрования, скажем для DES это 64 бит, для AES бывает и 128 и 256.

Вот тут-то и начинается самое интересное. Размер блока нужен внешней процедуре (функции) для того, чтобы понимать правила выравнивания блоков (padding) и проч. шифровальной муйне. Соответственно, нужен очевидно, геттер размера блока. Скажем для AES размер блока может быть любым между 128 и 256 (но кратно 32), а вот для DES он всегда константа и равно 64.

Ну и получится что-то типа:

abstract class Cipher {

abstract public getBlockSize(); }

class CipherDES extends Cipher { private static final int BLOCK_SIZE=64;

@Override public int getBlockSize() {return BLOCK_SIZE;} }

class CipherAES extends Cipher { private int blockSize;

@Override public int getBlockSize() {return blockSize;} }

Жизнь многогранна и бывает всякое. Так что не торопитесь с выводами даже в очевидных ситуациях.

Barmaley
  • 81,300
  • если оно private - то кто же спорит. Вопрос был о public.

    В приведенном Вами коде это уже не совсем геттер. Да, он выглядит как геттер, но таковым не является.

    – KoVadim Mar 18 '13 at 15:37
  • Ну дисклеймер я в самом начале писал. И, кстати, от того что константа будет public ничего не меняется - типа геттера все равно понадобится – Barmaley Mar 18 '13 at 15:46
0

Мне кажется это из разряда "на вкус и цвет товарища нет"...
Но я бы сделал геттеры.)

Stas0n
  • 2,033
  • 1
    геттер для константы? а смысл? – Gorets Mar 18 '13 at 14:17
  • @Gorets, я же сказал, что ответ на этот вопрос у каждого свой
    Если ты не можешь без полного ооп, то напишешь геттер, если более простой парень, то не будешь писать)
    – Stas0n Mar 18 '13 at 14:19
  • @KoVadim вот он аргументировал достаточно хорошо, можно константы в блокноте хранить и через энум делать, но это не просто "способ - как нравится, так и делай", это просто тупо – Gorets Mar 18 '13 at 14:23