1
votes

Définition d'objets en tant que partenaires au sein de la même classe en Java

En tant que tâche de mon cours pour débutants en programmation orientée objet, je dois définir deux objets dans ma classe Partner comme "mariés".

Voici ma tentative pour commencer:

public class Partner {

  String name;
  String partner;



  public Partner(String name, String partner) {
    super();
    this.name = name;
    this.partner = partner;
  }

  public String getPartner() {
    return partner;
  }

  public void setPartner(Partner()) { //think i need the object here?
    this.partner = partner;         //however i don't know how
  }

  public String getName() {
    return name;
  }


  public static void main(String[] args) {
    Partner p1 = new Partner("Name1", idk);
    Partner p2 = new Partner("Name2", idk);

  }

}

Mon problème est que je ne sais pas comment utiliser l'objet dans la méthode setPartner , si c'est même la bonne façon de le faire. Il devrait également être possible de divorcer de l'autre objet en définissant l'un des partenaires de l'un des objets sur null .

Cela devrait également permettre aux partenaires de s'enregistrer automatiquement en tant que marié l'un à l'autre si l'un d'eux est marié à l'autre. Par exemple, si p1 est défini comme le partenaire de p2, p2 devrait également être automatiquement défini comme le parter de p1.


0 commentaires

3 Réponses :


0
votes

Vous demandez-vous comment écrire des méthodes de setter? Quelque chose comme ça

    public void setPartner(String partner) {
        this.partner= partner;
    }


1 commentaires

Non, mais je suis presque certain que le passeur devrait être dans la catégorie "setPartner (Partner)". Je ne sais même pas si le partenaire String est nécessaire pour cela.



0
votes
  1. Si vous souhaitez qu'un objet Partner ait un pointeur vers un autre objet de cette classe, vous devez changer String partner en Partner partner .

  2. Vous n'aurez pas toujours un objet Partner initialisé à utiliser dans le constructeur Partner , vous avez donc 3 options:

    • ajouter un autre constructeur qui ne nécessite pas d'argument de type Partner
    • changer le constructeur existant
    • passez null comme argument. Dans tous les cas, vous devrez initialiser le champ partenaire ailleurs.
  3. C'est là que les setters entrent en jeu. La syntaxe correcte pour votre fonction setPartner serait:

    Partner p1 = new Partner("Name1", null);
    Partner p2 = new Partner("Name2", p1);
    p1.setPartner(p2);
    
    La fonction

    getPartner () doit être modifiée en conséquence pour renvoyer le type correct.

  4. Votre code dans main () peut alors être quelque chose comme ceci:

    public void setPartner(Partner partner) {
      this.partner = partner;
    }
    
  5. Il devrait également être possible de divorcer de l'autre objet en définissant le partenaire de l'un des objets sur null.

    Ceci est accompli en utilisant p.setPartner (null) , où p est un objet de type Partner . Vous pouvez également définir les deux objets partner s sur null au lieu d'un seul, pour une vérification plus facile.


4 commentaires

Merci! J'ai maintenant réussi à définir le partenaire d'un objet, mais il ne définit pas automatiquement l'autre objet comme partenaire. Par exemple; p2.setPartner (p1) ne définit pas de partenaire pour p1, uniquement pour p2. Avez-vous une idée de pourquoi? De plus, lorsque mon toString est constitué de null, il plante le programme. Comment contourner cela?


@alleElskeEtComeback Si vous souhaitez définir partner pour les deux objets avec un seul appel setPartner () , vous devez ajouter partner.setPartner (this) au Fonction setPartner () . De cette façon, il définira le champ partenaire des deux objets. En ce qui concerne le plantage, vous pouvez simplement vérifier s'il pointe vers null (par exemple if (p == null) ), et renvoyer une chaîne appropriée.


À quoi ressemblerait le setter alors? Si je l'ajoute simplement comme sa propre ligne après this.partner = partner, cela crée une erreur récursive.


@alleElskeEtComeback Vous pouvez vérifier si partner.getPartner ()! = this et appeler partner.setPartner (this) uniquement si cette déclaration est vraie.



0
votes

Créez deux constructeurs: un avec juste nom et un autre avec nom et partenaire (de type, Partenaire ) afin que vous ayez la flexibilité d'initialiser un objet avec juste le nom, puis de définir son partenaire ou de l'initialiser avec le nom et le partenaire (si le partenaire est connu).

Name1, partner=Name2
Name2, partner=Name1
Name3, partner=Name4
Name4, partner=Name3

Résultat:

public class Partner {

    private String name;
    private Partner partner;

    public Partner(String name) {
        this.name = name;
    }

    public Partner(String name, Partner partner) {
        this.name = name;
        setPartner(partner);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPartner(Partner partner) {
        partner.partner = this;
        this.partner = partner;
    }

    @Override
    public String toString() {
        String value;
        if (partner != null) {
            value = name + ", partner=" + partner.name;
        } else {
            value = name;
        }
        return value;
    }

    public static void main(String[] args) {
        // Example 1
        Partner p1 = new Partner("Name1");
        Partner p2 = new Partner("Name2");
        p1.setPartner(p2);
        System.out.println(p1);
        System.out.println(p2);

        // Example 2
        Partner p3 = new Partner("Name3");
        Partner p4 = new Partner("Name4", p3);
        System.out.println(p3);
        System.out.println(p4);
    }
}


1 commentaires

Merci! Savez-vous comment je peux faire en sorte que p1.setPartner (p2) définisse également p1 comme partenaire de p2? En gros, dire que p1.setPartner (p2) doit exécuter p2.setPartner (p1) sans l'écrire.