I have an object that stores some data in a list. The implementation could change later, and I don’t want to expose the internal implementation to the end user. However, the user must have the ability to modify and access this collection of data. Currently I have something like this:
public List<SomeDataType> getData() {
return this.data;
}
public void setData(List<SomeDataType> data) {
this.data = data;
}
Does this mean that I have allowed the internal implementation details to leak out? Should I be doing this instead?
public Collection<SomeDataType> getData() {
return this.data;
}
public void setData(Collection<SomeDataType> data) {
this.data = new ArrayList<SomeDataType>(data);
}
It just depends, do you want your users to be able to index into the data? If yes, use List. Both are interfaces, so you’re not leaking implementation details, really, you just need to decide the minimum functionality needed.