Вход на сайт
Java to C#
556 просмотров
Перейти к просмотру всей ветки
в ответ AlexNek 24.10.14 22:34
В ответ на:
Если в Яве 5 порций мороженного константа, то мне подобная точка зрения не нравится.
Если в Яве 5 порций мороженного константа, то мне подобная точка зрения не нравится.
Строго говоря констант в яве нет вообще. Есть "поля, инициализируемые один раз" - final (readonly). Константами принято называть static final-ы. То что часть из них и правда константы, к которым мы привыкли во многих других языках, от "нормального" разработчика скрыто. Так что да, финальное поле может быть проинициализированно не цифрой 5 а, например, списком.
public static final List<String> ICE_CREAM_NAMES = new ArrayList<String>(); // в поле класса хранить изменяемый список - фи. Опасность утечки памяти. Но синтаксис позволяет.
Такая конструкция - не константа "список из 5 имен мороженного" (хотя можно добиться и такого с помощью неизменяемых списков, лучше все равно enum сделать), а просто подсказка - что это ссылка на список, хранящаяся в этом поле, никогда не изменится. Так что можно смело ее использовать, null-ем она не станет никогда. Ну и запрет ее менять, чтобы не получилось что у кого-то осталась ссылка на другой, старый список. Ну и многопоточный доступ к final-ам оптимизируется, но это уже технические подробности.
В ответ на:
ну да, если смотреть со стороны, что на момент компиляции текст класса константа
ну да, если смотреть со стороны, что на момент компиляции текст класса константа
Не, не так. Такой вложенный класс это простой отдельный класс. С необычным именем. Если в интерфейсе a.b.c.X определить внутренний класс Z то его полное имя - a.b.c.X.Z
Такие классы - указание на то, что они нужны только для класса - родителя. Еще один способ группировать классы - не только по пакетам, но и по классам (опять же только если внутренний класс нужен исключительно родителю). Если такой вложенный класс еще и публичный - то доступ к нему имеют все остальный классы. Представлены такие классы таким же обычным объектом типа Class как и все остальные. Так что с точки зрения компилятора определение такого статического вложенного класса можно было смело выносить в другой файл - разницы (кроме имени) не будет.
Для обычных классов такие внутренние и вложенные (да, есть разница :) см. nested и inner) классы - удобны. Например, если если интерфейс IListener, с методом, например, IProcessor getProcessor() и этот процессор имеет смысл только для конкретного листенера, вот тогда и делаем в классе MyListener вложенный класс Processor, и в классе AnotherListener тоже Processor. И получаем два процессора - MyListener.Processor и AnotherListener.Processor уже из имени которых понятно кому они принадлежат, и где используются.
ИМХО, было бы лучше если бы в интерфейсах внутренние классы (но не интерфейсы) были бы запрещены. Как и вообще анонимные классы. Но, для агильных вьюношей "а дайте мне возможность писать 1 нечитаемую строчку вместо 3-х понятных" - оставили и такое.
В ответ на:
Да все теже Ява проггеры, сиди потом и думай как это перевести, то там поставят то сям.
Да все теже Ява проггеры, сиди потом и думай как это перевести, то там поставят то сям.
Ну это несерьезно. Это как жаловаться на сионистов, которые то там то сям своих звездочек с амперсандами поналепят. (а вот на перлистов с их $??!$_$@$?!$? и прочими красотами - надо жаловаться :))
во всем этом есть смысл. И разобраться не сложно.
public - protected - <default> - private - ограничение доступа, тут все просто. static или нет, final или нет и пара модификаторов вроде transient, volatile для полей и strictfp для методов. И еще abstract для методов и классов - всё.
private static final int DEFAULT_REFRESH_DEPTH = 5; // Внутренняя константа для класса. Даже подклассы ее не видят (и никаких friend-ов!)
public final static RelationalOperator EQUALS=new RelationOperatorImpl("=") {..} // доступное всем ro поле класса инициализированное объектом анонимного класса (подкласс RelationOperatorImpl)
private static transient - внутреннее поле класса, которое не сохраняется при сериализации.
private void initControl() { // обычный приватный метод
final String converted = input == null ? "" : (String)converter2String.convert(input); // ro переменная, с областью применения внутри метода. (а вот (String)converter2String.convert(input) - некрасиво. Если уже converter2String то могли бы и Generic-и использовать)
}
public static InputStream construct(final String rawMaterial) { // - обычный публичный метод класса
Никаких чудес. Что тут запутанного-то?
Если что-то конкретное непонятно - спрашивай, расскажу.