However it is best practice to code
against interfaces instead of concrete
implementations.
I submit that no, in this case it is not. Findbugs quite correctly tells you that you risk running into a NotSerializableException as soon as you have a non-serializable Set implementation in that field. This is something you should deal with. How, that depends on the design of your classes.
- If those collections are initialized within the class and never set from outside, then I see absolutely nothing wrong with declaring the concrete type for the field, since fields are implementation details anyway. Do use the interface type in the public interface.
- If the collection are passed into the class via a public interface, you have to ensure that they are in fact
Serializable. To do that, create an interfaceSerializableSet extends Set, Serializableand use it for your field. Then, either:- Use
SerializableSetin the public interface and provide implementation classes that implement it. - Check collections passed to the class via
instanceof Serializableand if they’re not, copy them into something that is.
- Use