Как бы мне связать два класса вместе, чтобы показать отношение «один ко многим» между Person и Address

#java #class #oop

#java #класс #ооп

Вопрос:

Класс адресов:

 public class Address {

    private String country;
    private String county;
    private String city;
    private String postcode;
    private String HouseNumber;

    public Address(String country, String county, String city, String postcode, String HouseNumber) {
        this.country = country;
        this.county = county;
        this.city = city;
        this.postcode = postcode;
        this.HouseNumber = HouseNumber;
    }

    public void view_adress() {
        String[] address = {country, county, city, postcode, HouseNumber};
        
        for (int i = 0; i<address.length; i  ) {
            System.out.println(address[i]);
        }
    }
                
    public void viewHouseNumber() {
        System.out.print(HouseNumber);
    }
}
  

Класс Person:

 public class Person {
    private String firstName;
    private String lastName;
    private String Date_of_birth;
    private String PhoneNumber;
    private String[] address;
    
    public Person (String firstName, String lastName, String Date_of_birth, String PhoneNumber, String[] address) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.Date_of_birth = Date_of_birth;
        this.PhoneNumber = PhoneNumber;
        this.address = address;
    }

    public void view_PhoneNumber() {
        System.out.print(PhoneNumber);
    }
}
  

Комментарии:

1. Пожалуйста, избавьте читателей и отформатируйте / очистите свой код.

2. На самом деле между людьми и адресами существует связь «многие ко многим» в реальном мире.

3. Обратите внимание, что обычно вам следует избегать использования массивов; List лучше, потому что он автоматически управляет размером и имеет другие функции. Кроме того, ваш код будет легче читать, если вы будете следовать стандартам кода: члены должны быть camelCase , не TitleCase ( PhoneNumber ) или snake_case .

4. @NomadMaker спасибо за правильное понимание. Я также добавил эту информацию.

Ответ №1:

Используйте композицию ООП.

 public class Person {
    //...
    List<Address> addresses;
    //...
}
  

Один экземпляр a Person будет иметь 0 или более экземпляров Address .

Обратите внимание, что в реальном сценарии вам лучше сохранить список userId s и в вашем Address классе, потому что у более чем одного пользователя может быть один или несколько адресов, а это значит, что ваше отношение должно быть Many-To-Many .

Не менее (вообще) важно придерживаться соглашений об именовании Java и именования:

  • классы с PascalCase ;
  • имена полей и методов с camelCase ;
  • константы с ALL_CAPS_SEPARATED_WITH_UNDERSCORES помощью .

Комментарии:

1. Это бы устранило необходимость в атрибуте private String[] address

2. У вас есть Address тип. Почему вы хотите иметь a String[] address; вместо этого? вы хотите хранить адреса в виде строковых литералов? в этом случае использование дискретного / отдельного типа ( Address ) — лучшая идея, а не сохранение ваших адресов в виде строковых литералов. Итак, да, String[] address кажется ненужным.

3. Я совсем новичок в Java!

4. Просто измените свой private String[] address; с private List<Address> addresses; помощью . Примечание. Пожалуйста, следуйте соглашениям об именовании Java: не начинайте свои идентификаторы переменных с первого заглавного символа (который у вас есть в нескольких случаях). Кроме того, сделайте имена ваших полей описательными. Например. когда вы храните список объектов, вероятно, лучше назвать поле как адреса .

5. Я перепостирую вопрос, который я изменил в классе person на другой формат, будет ли это по-прежнему работать.