【问题标题】:Is it bad practice to return a mutable object when the return value is an immutable object?当返回值是不可变对象时,返回可变对象是不好的做法吗?
【发布时间】:2012-09-12 17:25:03
【问题描述】:

如果我有这个方法:

+ (NSDictionary *)dictionaryFromQueryString:(NSString *)queryString
{
    NSMutableDictionary *this = [[NSMutableDictionary alloc] init];

    NSArray *fields = [queryString componentsSeparatedByString:@"&"];

    for(NSString *field in fields)
    {
        NSArray *fieldParts = [field componentsSeparatedByString:@"="];

        NSString *value = @"";

        if(fieldParts.count > 1)
        {
            value = [[fieldParts subarrayWithRange:NSMakeRange(1, fieldParts.count - 1)] componentsJoinedByString:@"="];
        }

        [this setObject:unescape(value) forKey:unescape(fieldParts[0])];
    }

    return this;
}

我返回 NSMutableDictionary 而不是 NSDictionary 是不好的做法吗?

我应该将其转换为带有return [this copy];NSDictionary 吗?

【问题讨论】:

    标签: objective-c nsdictionary immutability nsmutabledictionary


    【解决方案1】:

    视情况而定。

    Sergio 的回答是正确的,除了一个非常重要的问题:

    如果包含可变字典的对象在另一个对象检索到字典后对其进行变异,会发生什么情况?除非另一个对象是专门为支持字典可能发生变异的可能性而编写的,否则另一个对象现在将处于不一致的状态。

    鉴于copy 对于字典来说速度很快,因为它是一个浅的不可变副本,通常总是返回一个副本比返回对可变版本的引用要好得多。如果您发现您的代码正在使用创建副本的方法,则在您的对象中缓存一个不可变副本并将其出售,从而在可变后备存储发生更改时使其无效。

    【讨论】:

      【解决方案2】:

      我不认为这是不好的做法。这样做的最终效果是NSDictionary 的接收者不会尝试修改对象(尽管对象是可变的)。这是非常安全的,而且很有意义,因为您的使用者方法保持更通用(它可以与可变和非可变对象一起使用)。

      【讨论】:

        【解决方案3】:

        以这种方式返回不可变对象并不是真正不好的做法,因为NSMutableDictionaryNSDictionary 的子类。这是多态性,所以“一切都好”。

        但我可能会返回这样的自动发布副本:

        return [NSDictionary dictionaryWithDictionary:this];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-11
          • 2020-11-13
          • 1970-01-01
          • 2011-07-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多