русский
Germany.ruForen → Архив Досок→ Programmierung

Java to C#

25.10.14 09:59
Re: Java to C#
 
MrSanders старожил
in Antwort AlexNek 24.10.14 22:34
В ответ на:
Если в Яве 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) { // - обычный публичный метод класса
Никаких чудес. Что тут запутанного-то?
Если что-то конкретное непонятно - спрашивай, расскажу.
 

Sprung zu