Вход на сайт
Java to C#
556 просмотров
Перейти к просмотру всей ветки
в ответ AlexNek 25.10.14 13:39
В ответ на:
Ну типа что приятнее блондинки или брюнетки
Ну типа что приятнее блондинки или брюнетки
Каждому инстрУменту - свое место. Брюнетку - домой, блондинку - в клуб :)
В ответ на:
А с мороженным имелось в виду немного другое. Что то типа этого
А с мороженным имелось в виду немного другое. Что то типа этого
Угу, я понял. Пример со стрингом чтобы понагляднее, покороче было.
В ответ на:
final - "поля, инициализируемые один раз" - (readonly)
final - "поля, инициализируемые один раз" - (readonly)
Именно так. Потому и final - "окончательное значение".
В ответ на:
Во, вот это и есть хреново Потому как кто то обязательно сделает фи раз можно.
Во, вот это и есть хреново Потому как кто то обязательно сделает фи раз можно.
Тут такое дело... Что мне в яве нравится - у нее есть своя логика. И не так много мест где "вообще-то так, но в случае если ... при условии что..." и те де. Поэтому если решили что final-ы можно инициализировать вызовом методов или конструкторов, то ограничивать типы, какие могут быть final, а какие нет - не разумно.
Ну а что уже "фи" выяснилось со временем. Те же списки, мэпы, множества и прочие контейнеры создают проблемы в static final-ах только если не контролировать как он наполняется. Привыкнув к тому, что в яве со всем ненужным мусором справляется GC, мало кто вспоминает что не надо пихать кучу объектов в поле класса - пока загрузчик классов не уничтожится, эту память не освободить. А контролировать можно, например, используя "неизменяемые" контейнеры. Делаешь, например, неизменяемый мэп от имени к объекту, и быстрый доступ - O(1) - к объекту по его имени.
В ответ на:
Может я не совсем правильно понял но тогда процессору нефиг делать в интерфейсе
Может я не совсем правильно понял но тогда процессору нефиг делать в интерфейсе
Не совсем. IListener и IProcessor в моем примере были два разных интерфейса. В примере были классы, реализующие эти интерфейсы.
Но. Интерфейс вложенный в интерфейс - тоже имеет право на жизнь. Например, в яввской стандартной библиотеке в java.util.Map если внутренний интерфейс Entry. И четко понятно что написав Map.Entry мы имеем в виде запись в мэп. Можно было бы добиться того же сделав java.util.map.Map и java.util.map.Entry, но зачем.
А так да - классам, логике в интерфейсах делать нечего. В изначально примере, с которого мы начали, вообще интерфейс лишний. Я бы сделал enum :)
В ответ на:
static final - final static: Есть разница или нет?
static final - final static: Есть разница или нет?
нет
В ответ на:
static abstract class - нафига абстрактному классу статик? И не вижу аналога на шарпе.
static abstract class - нафига абстрактному классу статик? И не вижу аналога на шарпе.
Хе. А вот тут мы подходим к вложенным и внутренним классам :)
Такое определение возможно только у вложенного класса (определенного внутри тела другого класса). static class говорит нам что этот класс вложенный (определен внутри другого) но не внутренний (внутренний был бы без static). Разница - в доступе к полям класса-родителя. У вложенного (static nested) класса никаких преимуществ нет. У внутреннего (inner) - есть. Внутренний существует только внутри объекта, и имеет доступ к полям объета, даже если они приватные.
Так что тут определен вложенный абстрактный класс.
В ответ на:
final/static внутри функции - фиг переведешь
final/static внутри функции - фиг переведешь
static внутри методов - иззя. final означает то же самое что и не в функции - что переменная инициализируется один раз. Еcли надо контролировать что это значение случайно сам не перепишешь.
Или если надо проконтролировать что ты не забыл проинициализировать переменную.
final boolean isEqual;
if(...){ // 1
if(...){ // 2
isEqual = true;
} // <-- а вот тут мы забыли else и если (2) будет false, то наш isEqual не проинициализируется. Компайлер сообщит об ошибке.
// а если мы тут напишем isEqual = true, то компайлер опять ругнется = скажет что переменная уже возможно проинициализирована.
} else {
isEqual = false;
}
В ответ на:
final для аргументов - зачем?
final для аргументов - зачем?
Для аргументов методов? Чтобы случайно не переопределить. Лично я часто использую (почти везде, где значение аргумента не должно меняться). Помогает тупых ошибок избегать.
class X {
private int a;
public void setA(int a){
a = a; // ничего не произойдет. поле a класса не изменится, мы забыли this.a написать.
}
public void setA2(final int a){
a = a; // а тут компайлер кинет ошибку.
}
}