На сайте StackOverflow прозвучал еще один интересный вопрос. Представляю его в виде диалога:
В спецификации сказано «хотя константы являются статическими членами, при объявлении модификатор static не требуется и является недопустимым». Почему не принято решение обязать использование модификатора static для констант, раз они и так являются статическими?
Давайте согласимся с тем, что вполне разумно, что константы являются «статическими», поскольку они связаны с самим типом, а не с членами определенного экземпляра. Давайте также согласимся с тем, что без «const» тоже не обойтись. Итак, у нас остается три возможных варианта объявления константы:
1) Сделать модификатор static опциональным: выражения "const int x..." или "static const int x..." оба являются корректными.
2) Сделать модификатор static обязательным: выражение “const int x…” – некорректно, “static const int x…” – корректно.
3) Сделать модификатор static недопустимым: выражение “const int x…” – корректно, выражение “static const x…” – некорректно.
Согласны?
Да. Но почему команда разработчиков языка выбрала вариант (3), а не вариант (1) или (2)?
Об этом ничего не говорится в проектных записях за 1999 год. Но мы можем предположить, что скорее всего творилась в головах проектировщиков языка.
Проблема с вариантом (1) заключается в том, что вы сможете встретить код, который использует оба варианта, и “const int x…” и “static const int y…”, и вы будете, естественно, спрашивать себя «а в чем разница?» А поскольку по умолчанию неконстантные поля и методы являются «экземплярными», а не «статическими», вы сделаете естественный вывод, что некоторые константы относятся к экземпляру, а некоторые – к типу, и этот вывод будет совершенно неверным. Этот вариант является плохим, поскольку он может вводить в заблуждение.
Проблема с вариантом (2) прежде всего, связана с избыточностью. Вам приходится больше набирать, не добавляя при этом ясности или выразительности языка. Кроме того, я не знаю насчет вас, но лично меня просто бесит, когда компилятор выдает мне ошибку «Ты забыл мне сказать волшебное слово. Я знаю об этом, и я совершенно спокойно могу узнать это слово самостоятельно, какое слово требуется в этом случае, но я ничего не буду делать, пока ты не скажешь мне это волшебное слово сам».
Проблема с вариантом (3) состоит в том, что разработчику нужно знать о том, что константность логически подразумевает отношение к типу, а не экземпляру. Однако, как только разработчик выяснит этот факт, проблема исчезнет. Это не такая уж и запутанная идея, которую невероятно сложно понять.
Решение, которое является наиболее дешевым и влечет за собой минимальное количество проблем для конечного пользователя это (3).
Звучит разумно. В языке C# этот прин...