#objective-c #immutability #instance-variables #mutable
#objective-c #неизменяемость #переменные экземпляра #изменяемый
Вопрос:
У меня есть класс со свойством sampleNames.
, оно имеет тип NSSet. Переменной экземпляра, которую я планирую использовать, будет NSMutableSet.
единственная причина, по которой я использую NSMutableSet, — это удобство для меня. Но я помню, что мне «сказали», что изменяемый класс следует использовать как можно реже по какой-то причине, которую я не могу вспомнить. Я понимаю, как использовать оба способа, так что это не столько вопрос об этом.
Каковы практические соображения при принятии решения о том, использовать ли изменяемый класс внутри?
Пожалуйста, обратите внимание, я совсем не заинтересован в изменении моего СВОЙСТВА на NSMutableSet. Но тот факт, что я использую другой тип внутри, заставил меня задуматься о том, почему, и у меня нет реального оправдания, кроме удобства, которое, как я обнаружил, само по себе является плохим оправданием. Возможно, это единственная причина, но я не очень хорошо понимаю, чем я торгую для удобства.)
Ответ №1:
Я думаю, вы в замешательстве.
Вы используете NSMutableSet, когда вам нужно изменить содержимое набора. Вы можете сделать это, только если оно изменяемое.
Если вы используете NSSet, то вы не можете изменить содержимое.
Итак… ваше объявление свойства и переменная экземпляра должны быть одного и того ЖЕ класса. Либо используйте NSSet, если вам не нужно изменять содержимое, либо NSMutableSet, если вам это нужно.
Наличие другого класса для свойства и переменной экземпляра является верным путем к катастрофе… это не удобно и сбивает с толку = ПЛОХО 😉
Комментарии:
1. Мне нужно изменить значение внутри класса, но ни один другой класс не нуждается или не должен иметь возможности изменять содержимое набора. NSMutable — это подкласс NSSet, поэтому я могу просто вводить тип при возврате. Для меня это имеет смысл… Мой вопрос был больше о различиях в «накладных расходах» или производительности между изменяемым и неизменяемым
2. То есть я не думаю, что меня смущает то, что, по вашему мнению, меня смущает, но я все еще мог бы быть убежден, что то, что я хочу сделать, — плохая идея. (ПОПРАВКА к сообщению выше: я мог бы ввести тип или просто вернуть неизменяемую копию)
3. Я бы просто не делал
@property
тогда, я бы рекомендовал написать средство получения самостоятельно. Вполне допустимо возвращать полномасштабныйNSMutableSet
из такого метода, как- (NSSet)getSet
. По сути, вы только в большей степени делаете его «доступным только для чтения».