6 votes

Java - Est-il possible d'avoir une méthode qui transmet des valeurs de champs privés dans une méthode d'une autre classe ?

J'ai une classe avec un grand nombre de champs, tous privés (les sous-classes accèdent à certains d'entre eux avec des getters protégés). J'ai besoin de passer la plupart de ces champs dans une méthode d'une autre classe qui va les formater et générer une sortie. Est-il possible d'avoir une méthode dans la classe avec les champs qui les transmettra tous ? Ou est-ce que ces circonstances suggèrent que je devrais implémenter une autre relation entre les deux classes, puisqu'elles semblent étroitement couplées à cause de cela ?

Informations complémentaires : la classe A représente les employés, la classe B a pour seule responsabilité de formater la sortie du programme.

6voto

Paul D'Ambra Points 2684

Vous demandez s'il est possible de faire ce qui suit ?

public class A {
 private B myB = new B();
 private String myUnformattedName = "some information";

 public String getFormattedInfo() {
   return myB.formatInfo(myUnformattedName);
 }
}

C'est tout à fait normal.

Marquer un champ comme privé signifie simplement que seule la classe qui le contient doit pouvoir y accéder...

Si vous voulez dire autre chose, il est préférable d'insérer un code dans votre question pour donner aux gens le contexte.


OK, il n'y a aucun moyen de définir les valeurs ici, mais vous pouvez voir ici deux façons différentes d'appeler le formateur. Lorsque la liste des paramètres dépasse trois ou quatre éléments, elle devient difficile à lire.

Dans ce cas, je passerais simplement A dans le formateur et j'aurais une méthode get pour chaque valeur que vous voulez que B puisse lire.

public class A {
 private B myB = new B();
 private String myUnformattedName = "some information";
 private String myUnformattedNameOne = "some information";
 private String myUnformattedNameTwo = "some information";
 private String myUnformattedNameThree = "some information";
 private String myUnformattedNameFour = "some information";
 private String myUnformattedNameFive = "some information";
 private String myUnformattedNameSix = "some information";

 public String getFormattedInfo() {
   //pass the object itself and use get methods
   return myB.formatInfo(this); 
 }

 public String getFormattedInfoLong() {
   //this is OK but gets difficult to read the longer the 
   //parameter list gets
   return myB.formatInfo(myUnformattedName, myUnformattedNameOne, 
      myUnformattedTwo, myUnformattedNameThree, myUnformattedNameFour,
      myUnformattedNameFive, myUnformattedNameSix); 
 }

 //getters
 public String getUnformattedName() {
    return myUnformattedName;
 }

 public String getUnformattedNameOne() {
    return myUnformattedNameOne;
 }

 //etc

}

5voto

Simon Hellinger Points 1181

En fait, je suggérerais le modèle Visiteur.

La classe A possède une méthode qui accepte un visiteur, qui possède à son tour une méthode publique bien définie, comme celle-ci :

Tout d'abord, la classe visitée permet à une classe ayant une interface bien définie d'entrer, et ne transmet pas ses propres données à l'extérieur.

public class A {
    int data;

    public void getFormattedBy(Formatter f) {
       f.format(data);
    }
}

L'interface du visiteur permet l'utilisation de plusieurs formateurs.

public interface Formatter {
    void format (int data);
}

Un formateur autorisé dans la classe visitée.

public class B implements Formatter {
    public void format(int data) {
        // do the formatting and printing
    }
}

De cette manière, il suffit d'appeler

A a = new A();
B b = new B(); // the formatter
a.getFormattedBy(b);

En fin de compte, un visiteur (le formateur) peut visiter de nombreuses classes qui l'autorisent à entrer (probablement en implémentant une interface propre), et une classe visitée peut être visitée par de nombreux visiteurs.

2voto

NPE Points 169956

Je pense qu'il est tout à fait possible de les transmettre, tant qu'ils ont un type primitif ou qu'ils sont immuables.

Si la personne qui appelle peut les modifier alors qu'elle n'est pas censée le faire, il y a un problème de conception.

1voto

Miloš Lukačka Points 579

Tout va bien tant que la classe B ne les modifie pas. Si la classe le fait, passez-lui des instances immuables.

1voto

Vous pouvez faire de la classe B une classe utilitaire et ne lui appliquer que des méthodes statiques.

Ensuite, dans votre classe A, vous pouvez avoir quelque chose comme.. :

public String formatMyVariables() {

return B.format(a,b,c,d) ;

}

Je suppose que la sortie que vous avez mentionnée est une chaîne de caractères, mais il peut s'agir de n'importe quoi.

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