11
votes

Façons de réaliser des traits Java efficaces?

S'il vous plaît laissez-moi savoir si cela est inapproprié comme formulé (en particulier si les programmeurs.se ou quelque chose seraient mieux pour la question.)

D'accord. J'ai donc un certain nombre de «traits» que j'exprime actuellement en tant qu'interfaces. Appelons-les "Updatable" et "Destructible". Les exprimer comme des interfaces a la possibilité que je ne puisse pas partager le comportement entre tous les composants "destructibles"; D'autre part, les exprimer comme des classes abstraites signifient que je ne peux pas mélanger et faire correspondre sans définir explicitement le trait mixte comme une autre classe abstraite ("updateableandestructible") et que cela ressemble à un abus de la fonctionnalité de classe abstraite à ce moment-là. C'est probablement ce que je finirai par faire s'il n'y a pas de façons de manipuler cela, cependant.

Quelles sont mes options en ce qui concerne les solutions de Java pure à cette énigme? Est-il possible pour moi de décrire le comportement partagé, puis de mélanger et de faire correspondre comme je vois en forme sans avoir à décrire explicitement toutes les permutations, je vais utiliser?


1 commentaires

Vous êtes descibing Mixins - qui pourrait être un terme utile si vous faites une recherche.


4 Réponses :


4
votes

Je sais que vous avez dit "pure java", mais c'est quelque chose scala fait bien. Les limitations dans la langue Java elle-même sont un pilote puissant pour les personnes à adopter d'autres langues JVM ...


0 commentaires

6
votes

Peut-être que vous pourriez peut-être atteindre l'objectif en utilisant un mélange d'interfaces et d'implémentations par défaut.

J'aime: xxx

toujours bruyant et peut-être pas aussi flexible que vous le souhaitez Mais peut-être un peu plus propre que de faire la chose actualisée à l'autre.


1 commentaires

+1 et accepté, il s'agit d'un moyen raisonnable de gérer le problème. (Juste en passant, tout en enquêtant sur cela, j'ai trouvé un certain nombre de cadres utiles comme Guice qui le rendent un peu moins douloureux d'utiliser ce type de logique.)



5
votes

Je ne pense pas qu'il y ait une jolie solution à ce problème, mais peut-être quelques-unes de quelques-unes en fonction de la quantité que vous méprisez la chaudière.

Vous pouvez définir un trait comme une autre interface de classe +, qui prend l'instance objet comme premier paramètre. Et ils mettent en œuvre l'interface avec la classe que vous souhaitez avoir le trait. Ensuite, créez des méthodes de stub qui appellent les méthodes sur le trait IPL. P>

public interface MyTrait {
    public void doSomething();
}

public class MyTraitImpl {
    public static void doSomething(MyTrait obj) {
        // do something with obj
    }
}


0 commentaires

1
votes

Si vous envisagez d'utiliser Lombok comme pure Java, vous pouvez simplifier votre vie en utilisant @delegate < / code> comme ceci: xxx


0 commentaires