#java
Имеет ли смысл скрывать public static final константы и делать геттер либо нет? Вышел небольшой спор... Спасибо! :)
Ответы
Ответ 1
Универсальное правило ровно одно: следуйте семантике, смыслу кода. Если вы экспортируете константу, смело выставляйте наружу 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# уже обсуждался на сайте.Ответ 2
Нет никакого смысла. Поле то никак не поменяется - оно же final. Оно public - то есть уже доступное. Более того, вносить дополнительную прослойку - это только для адептов полного ООП. Если не согласны, то подумайте над вопросом - а следует ли делать для этих полей setter'ы (это вопрос с большой долей иронии).Ответ 3
Я понимаю вопрос так: имеет ли смысл скрывать 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;} } Жизнь многогранна и бывает всякое. Так что не торопитесь с выводами даже в очевидных ситуациях.Ответ 4
Мне кажется это из разряда "на вкус и цвет товарища нет"... Но я бы сделал геттеры.)
Комментариев нет:
Отправить комментарий