Marker Interfaces in Java?
Solution 1:
- Is the definition of a marker interface mentioned above in 1st point wrong? - It is correct in the parts that (1) a marker interface must be empty, and (2) implementing it is meant to imply some special treatment of the implementing class. The part that is incorrect is that it implies that JVM or the compiler would treat the objects of that class differently: you are correct in observing that it is the code of Java class library that treats these objects as cloneable, serializable, etc. It has nothing to do with the compiler or the JVM.
-
instead of using the instanceOf operator why can't the method be something like
writeObject(Serializable)
so that there is a compile-time type checking - This lets you avoid polluting your code with the name of the marker interface when a "plainObject
" is needed. For example, if you make a class that needs to be serializable, and has object members, you would be forced to either do casting or make your objectsSerializable
at compile time. This is inconvenient, because the interface is devoid of any functionality. - How Annotations are better than Marker Interfaces? - They let you achieve the same purpose of conveying metadata about the class to its consumers without creating a separate type for it. Annotations are more powerful, too, letting programmers pass more sophisticated information to classes that "consume" it.
Solution 2:
It is not possible to enforce Serializable
on writeObject
because children of non-serializable class can be serializable, but their instances may be upcasted back to the parent class. As a result, holding a reference to something non-serializable (like Object
) does not mean that the referred instance cannot be really serialized. For instance in
Object x = "abc";
if (x instanceof Serializable) {
}
the parent class (Object
) is not serializable and would be initialised using its parameter-less constructor. The value referenced by x
, String
, is serializable and the conditional statement would run.