Initialize a collection within an object?

2019-03-13 19:31发布

If an object has a property that is a collection, should the object create the collection object or make a consumer check for null? I know the consumer should not assume, just wondering if most people create the collection object if it is never added to.

标签: c# .net oop
10条回答
SAY GOODBYE
2楼-- · 2019-03-13 20:17

I typically will create the collection then provide methods to add / remove items from the internal collection rather than making the consumer of the class worry about checking for null. This also gives you the ability to control better what happens to the collection. Ultimately it depends on what it is for, but most likely if your class has a collection it isn't just so that the consumer of the class can have a collection of those objects. Otherwise, why would they use your class?

查看更多
家丑人穷心不美
3楼-- · 2019-03-13 20:18

This depends on the contract you have between your API and the user.

Personally, I like a contract that makes the Object manage its collections, i.e., instantiating them on creation, and ensuring that they can't be set to null via a setter - possibly by providing methods to manage the collection rather than setting the collection itself.

i.e., addFoo(Foo toAdd) instead of setFooSet(Set set), and so on.

But it's up to you.

查看更多
Emotional °昔
4楼-- · 2019-03-13 20:18

IMO, this is where IEnumerable comes in nicely.

Personally, I like my 'collection' properties to be initialized to empty lists.

查看更多
【Aperson】
5楼-- · 2019-03-13 20:22

As a general rule, I think the object should create the collection and provide methods for manipulating it; add/get/remove. When following this rule, you should not provide methods for setting the collection directly. If you want a method like setSomeCollection(Collection someCollection) for convenience, the implementation of this method should not set the reference within the object, but copy the values from the method parameter collection to the collection within the object;

public void setSomeCollection(Collection someCollection) {
   this.someCollection.clear();
   this.someCollection.addAll(someCollection);
}

You should do this, so clients of your API cannot get access to the collection that your class maintains. If they do, they can manipulate it without using objects of your class and violate constraints that your class guarantees.

The same is true if providing a getter; you should either return a copy of your internal colleciton, or a read-only version of it. Apache commons-collections and google-collections provide methods for creating immutable wrappers around a collection, aswell as the ones that come with Java in the java.util package; java.util.Collections.unmodifiable*.

查看更多
登录 后发表回答