Java - značkovací interface

dustin

Re:Java - značkovací interface
« Odpověď #15 kdy: 06. 06. 2017, 09:02:02 »
Otázkou je, zda v takových případech má ještě dědičnost smysl a zda není výhodnější ji nahradit kompozicí.

Je to úplně normální situace např. ve wicketu, který vyžaduje serializovatelné fieldy a objekty modelu. DTO_A implements Serializable, přidá se nová funkcionalita používající potomka DTO_B rozšířeného o nějaké položky, u kterých se zapomene na požadavek serializovatelnosti (ač je implements zděděné) a po spuštění si wicket stěžuje, že se mu serializace nepovedla, přestože z hlediska kompilátoru je vše v pořádku.

Teorie je jedna věc, ale praxe vypadá (někdy naštěstí) jinak.


Kit

Re:Java - značkovací interface
« Odpověď #16 kdy: 06. 06. 2017, 09:32:21 »
Otázkou je, zda v takových případech má ještě dědičnost smysl a zda není výhodnější ji nahradit kompozicí.

Je to úplně normální situace např. ve wicketu, který vyžaduje serializovatelné fieldy a objekty modelu.

Pokud model obsahuje serializovatelné fieldy a objekty, jednoznačně to ukazuje na kompozici.

Ještě nedávno zde proběhla debata, že dědičnost je fuj a že se má vše řešit kompozicí. Samozřejmě má dědičnost svůj význam, ale tohle není případ, kdy by měla být použita.

dustin

Re:Java - značkovací interface
« Odpověď #17 kdy: 06. 06. 2017, 09:49:07 »
Ale houby, je to normální potomek, protože má stejný význam, jen nese navíc další informace - je specializovanější. Jen to "navíc" musí být také serializovatelné, což se musí zajistit ručně.

Youda

Re:Java - značkovací interface
« Odpověď #18 kdy: 06. 06. 2017, 10:04:05 »
Jen poznamka - marker interface zdedi i potomci tridy, zatimco anotace je konkretni tride.

Indicates that an annotation type is automatically inherited. If an Inherited meta-annotation is present on an annotation type declaration, and the user queries the annotation type on a class declaration, and the class declaration has no annotation for this type, then the class's superclass will automatically be queried for the annotation type. This process will be repeated until an annotation for this type is found, or the top of the class hierarchy (Object) is reached. If no superclass has an annotation for this type, then the query will indicate that the class in question has no such annotation. Note that this meta-annotation type has no effect if the annotated type is used to annotate anything other than a class. Note also that this meta-annotation only causes annotations to be inherited from superclasses; annotations on implemented interfaces have no effect.

phi

Re:Java - značkovací interface
« Odpověď #19 kdy: 06. 06. 2017, 13:27:08 »
Jen poznamka - marker interface zdedi i potomci tridy, zatimco anotace je konkretni tride.

Indicates that an annotation type is automatically inherited. If an Inherited meta-annotation is present on an annotation type declaration, and the user queries the annotation type on a class declaration, and the class declaration has no annotation for this type, then the class's superclass will automatically be queried for the annotation type. This process will be repeated until an annotation for this type is found, or the top of the class hierarchy (Object) is reached. If no superclass has an annotation for this type, then the query will indicate that the class in question has no such annotation. Note that this meta-annotation type has no effect if the annotated type is used to annotate anything other than a class. Note also that this meta-annotation only causes annotations to be inherited from superclasses; annotations on implemented interfaces have no effect.
Plati pro anotace s meta-anotaci @Inherited, ale neni to default. (To sem pisu hlavne proto, ze to z vaseho prispevku nejde vycist, ne proto ze bych nesouhlasil. A mate pravdu, na @Inherited jsem zapomnel.)