Изменяемый объект против неизменяемого объекта, например, переменной в objective C

#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 . По сути, вы только в большей степени делаете его «доступным только для чтения».