39 votes

Chaînage de méthodes en Java

Tout en répondant à quelques questions sur ici plus tôt, et depuis peu de travail, je l'ai fait dernièrement, j'ai été me demandais pourquoi Java ne prend pas en charge la méthode de chaînage sur son construit dans les classes.

Si je devais créer un Car de la classe par exemple, je pourrais le faire chainable par reutrning this au lieu de void comme suit:

public class Car {
    private String make;        

    public Car setMake(String make) {
        this.make = make;
        return this;
    }   
}

Est-il une raison particulière de les construit dans les bibliothèques n'ont pas tendance à faire les choses de cette façon? Est-il un inconvénient à ce que le chaînage de méthode?

J'ai peut-être oublié quelque chose, ce qui expliquerait l'absence de chaînage de méthode cependant, toute méthode de définition de type void par défaut doit retourner une référence à la présente (au moins à mes yeux elle le devrait). Ce serait faire de telles situations suivantes beaucoup plus propre.

container.add((new JLabel("label text")).setMaximumSize(new Dimension(100,200)));

plutôt que de la plus longue haleine: Remarque: Il ne serait pas vous empêcher de codage de cette façon, si vous l'avez souhaité.

JLabel label = new JLabel("label text");
label.setMaximumSize(new Dimension(100,200));
container.add(label);

Je serais très intéressé d'entendre les raisons derrière cette décision, Si je devais deviner ce serait qu'il y est des frais généraux associés à cela et devrait être utilisé seulement en cas de besoin.

34voto

Louis Wasserman Points 67557

Eh. Il y a des raisons de lisibilité des arguments dans les deux sens, il y a une telle chose que d'essayer de trop en mettre sur une seule ligne.

Mais honnêtement, je soupçonne ici c'est pour des raisons historiques: l'omniprésence de l'chaîne" comportement n'avait pas vraiment devenir populaire ou le bien-connu, par exemple lors du Swing était en cours d'élaboration. On pourrait dire qu'il aurait été ajoutés plus tard, mais des choses comme ça ont tendance à créer des binaires incompatibilités et autres problèmes que Sun/Oracle ont toujours été très prudent à propos de.

Plus récente JDK bibliothèques -- voir, par exemple, ByteBuffer , pour un majeur, l'exemple bien connu -- ont fourni le comportement de chaînage et autres, où il fait sens.

19voto

Tomasz Nurkiewicz Points 140462

Une autre raison à laquelle je peux penser est la performance , ou plus précisément: ne payez pas pour quelque chose que vous n'utilisez pas. return this après chaque méthode n'est pas très coûteux, mais nécessite toujours quelques cycles de processeur supplémentaires et un registre de processeur.

Il y avait même une idée d'ajouter implicite return this à chaque méthode déclarant la valeur de retour void mais elle a été rejetée.

9voto

biziclop Points 21446

Bien que nous ne pouvons que deviner la vraie raison, l'un d'eux pourrait être que strictement parlant, il n'est pas très OO.

Si vous les méthodes de vue que les actions qui représentent une action de l'modélisé monde, le chaînage de méthode n'a pas vraiment d'entrer dans l'image.

Une autre raison pourrait être le chaos qui pourrait se produire lorsque vous essayez de remplacer un enchaînés méthode. Imaginez cette situation:

class Foo {
   Foo chainedMethod() {...}
}

class Bar extends Foo {
   Foo chainedMethod() {...} //had to return Foo for Java versions < 1.5
   void doStuff();
}

Ainsi, lorsque vous essayez de faire, new Bar().chainedMethod().doStuff(), il ne compile pas. Et ((Bar)new Bar().chainedMethod()).doStuff() n'a pas l'air très bon, le fait :)

4voto

Garrett Hall Points 11902

Le chaînage de méthodes est généralement utilisé avec le modèle Builder, et vous pouvez le voir dans la classe StringBuilder . En dehors de cela, le chaînage de méthodes peut rendre moins claire la séparation des commandes et des créations. Par exemple, repaint() également faire partie de l'interface fluide? Alors j'aurais pu:

 container.add(label).repaint().setMaximumSize(new Dimension(100,200)));
 

et soudain, l'ordre de mes appels devient important, ce qui peut être caché dans la chaîne d'enchaînement.

1voto

GingerHead Points 1

La raison de la non-application de la méthode de chaînage allaient être les suivantes:

  • Le plus gros problème pour le Chaînage de Méthode est la finition problème. Bien qu'il existe des solutions de contournement, d'habitude, si vous avez ce que vous êtes préférable d'utiliser une Fonction Imbriquée. Fonctions imbriquées sont également une meilleure choix si vous avez trouvé dans un bazar avec des Variables de Contexte.

  • Il n'y a aucune garantie qu'un objet en dehors de la chaîne se fait retour valide, objet non-null. Aussi, le débogage de ce type de code est souvent beaucoup plus difficile car de nombreux *IDE*s n'évaluera pas l'appel de méthode à déboguer le temps comme un objet que vous pouvez inspecter

  • Il peut devenir confus lorsque vous êtes à l'appel de routines pour les autres classes de passer des arguments à l'un des chaînage de méthodes, quand il y en a beaucoup des paramètres à passer principalement parce que les lignes se très long

  • Il y a aussi un problème de performance, ce qui va beaucoup travailler sur la mémoire

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X