Java redeclare inherited interfaces?

While working on a small class called FractionNumber I found asking myself if I should implement an interface that I am already implementing. Sounds stupid, I know, but bear with me.

My class FractionNumber extends Number; Number implements Serializable. And I am unsure if FractionNumber should explicitly implement Serializable as well.

Of course it does not really matter because Serializable only defines final methods and FractionNumber inherits the Serializable ‘implementation’ of Number. But I kind of like making my FractionNumber explicitly Serializable.

Now to my question: Is this simply useless or does the verbosity help in some way? Does it make sense, in a philosophically sense, to declare FractionNumber being something it already is?

2

From a code point of view

Contracts set by the parent type should be implied for the sub type.

If you feel the need to express serialization abilities in every type that can be serialized (maybe you feel you need to explicitly remind yourself/co-developers that something can be serialized) you should refactor your code to strengthen the implication.

From a JavaDoc point of view

All interfaces implemented by the type, including inherited interfaces, are displayed in the header under “All implemented interfaces“. The only difference is the actual declaration displayed in the JavaDoc:

If directly implementing interface:

public class Sub extends Super implements Serialization

If inherited:

public class Sub extends Super

To me, this is clutter (duplication), and I recommend against it.

0

In general, you probably should not be redeclaring that you implement interfaces in this way but Serializable is not a normal interface. You say that “Serializable only defines final methods” but that’s not the case (I double-checked). Serializable declares no methods at all. It’s a marker interface which is widely considered to be an anti-pattern and I am in full agreement with that assessment.

The fact that your class must be serializable because a super-class (or interface) implements Serializable is an artifact one of the most prominent design flaws in Java. Serializable is specifed using an interface but transient is a keyword. Why serializable isn’t a keyword too is a bit of a head scratcher. If java serialization was designed now, it likely would be done with annotations.

Because of all this wackiness, if you are going to implement Serializable, I would go ahead and redeclare it to show that you actually intend it to work with java serialization and that it’s not Serializable because simply because a base class was declared that way. Personally, I wouldn’t use java serialization, though. There are many better ways to create wireformat and I think the idea of ‘object transmission’ is inherently flawed.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *