Походит на лучшее, которое Вы могли сделать, должен выполнить итерации через список, поскольку каждый объект добавляет его к списку "замеченных" объектов или иначе удаляет его из "замеченного", если это уже там, и в конце Ваш список "замеченных" объектов будет включать исключительный элемент. Это - O (n) в отношении времени и n в отношении пространства (в худшем случае, будет намного лучше, если список будет отсортирован).
то, что они - целые числа, действительно не включает в, так как там действительно ли ничто не является особенным, можно ли сделать со складыванием их... там?
Вопрос
я не понимаю, почему выбранный ответ является "лучшим" по любому стандарту. O (N*lgN)> O (N), и это изменяет список (или иначе создает копию его, которая является еще более дорогой в пространстве и времени). Я пропускаю что-то?
Строго говоря, такого модификатора доступа нет. Невозможно объявить поле (или метод / класс, если на то пошло) только доступным для подклассов; наиболее ограничительный модификатор, который вы можете использовать, - это protected
, который по-прежнему разрешает доступ к другим классам в пакете родительского класса.
Но кроме этой мелочи, protected
- это способ go.
Отредактируйте : чтобы уточнить, что защищенный - это вариант . Для доступа к защищенному методу вы должны быть либо подклассом , либо в одном пакете; вам не обязательно быть обоими. Таким образом, подкласс Command
, созданный в другом пакете, по-прежнему сможет получить доступ к (super) .m
.
вам нужно объявить Mediator m protected в вашем материнском классе.
Более того, в методе exec () вашего подкласса вам нужно выполнить m.doAFoobar () вместо med. doAFoobar (), поскольку med не член, а формальный параметр вашего конструктора.
abstract class Command {
protected Mediator m
public Command(Mediator med){
m = med;
}
abstract void exec();
}
Класс не является общедоступным, поэтому он может быть расширен только другими классами в том же пакете, а «m» защищен, поэтому к нему могут обращаться производные классы.
Если вы дадите med защищенный доступ, он будет доступен подклассам вне пакета.
http://java.sun.com /docs/books/tutorial/java/javaOO/accesscontrol.html
Если вы хотите, чтобы поле было доступно только самому классу и любым производным классам и другим классам в этом пакете, используйте ключевое слово protected. Это то, для чего он нужен, и он должен работать даже вне пакета. Вместо того, чтобы вызывать med.doFoobar ();, им нужно вызвать m.doFoobar ();
В качестве альтернативы вы можете создать защищенную (или даже общедоступную) функцию get. Таким образом вы предоставляете возможность получить посредник, но вам не нужно позволять им перезаписывать его после того, как он объявлен.
Однако то, что вы хотите (не может быть прочитано внутри пакета), невозможно в ключевой фразе java. Но, раз уж вы пишете этот конкретный пакет, не могли бы вы просто не получить к нему доступ изнутри пакета? Или создать свой собственный пакет только с этим файлом? Там'