簡體   English   中英

Java 類問題(一對多 - 多對一)?

[英]Java classes problem (one to many - many to one)?

我正在嘗試制作一個程序狗注冊,您可以在其中注冊用戶和狗。 我遇到的問題是讓不同的類一起工作。

我想讓它讓用戶可以有很多狗,但狗只能有一個用戶。

我希望能夠在類的 toString 中檢索狗和主人。

當我為我的 User 類調用 toString 時,它可以工作,但當我從 Dog 類中嘗試時,它不起作用。

更新我不明白的是,當它存儲在 User 類中時,我將如何從 dog 類訪問所有者?

我究竟做錯了什么?

添加我的狗類

    public class Dog{

    private String name, breed;
    private int age, weight;
    private User owner;

    public Dog(String n, String b, int a, int w){

        name = n;
        breed = b;
        age = a;
        weight = w;
    }


    public void setName(String n){
        name = n;
    }

    public String getName(){
        return name;
    }

    public String getBreed(){
        return breed;
    }

    public int getAge(){
        return age;
    }

    public int getWeight(){
        return weight;
    }

    public double getTailLength(){
        if(getBreed().equalsIgnoreCase("Tax") || getBreed().equalsIgnoreCase("Dachshund") ){
            return 3.7;
        }else{
            double d = (getAge()*getWeight()/10.0);
            return d;
        }
    }

    public void increaseAge(int a){
        if(a<getAge()){
            this.age = age;
        }else{
            this.age += a;
        }
    }

    public int testAge(){
        return age += 1;
    }

    public void setOwner(User owner){
        User oldOwner = this.owner;
        this.owner = owner;

        if(oldOwner != null && oldOwner != owner){
            oldOwner.removeDog(this);
        }

        if(owner!=null){
            owner.addDog(this);
        }
    }

    public User getOwner(){
        return owner;
    }


    public String toString(){
        return getName() + " " + getBreed() + " " + getAge() + " år " + getWeight() + " kg svans=" + getTailLength() + getOwner();
    }
}

用戶類

public class User{

    private String name;
    private ArrayList<Dog> owner = new ArrayList<>();

        public void addDog(Dog d1){
        if(!owner.contains(d1)){
            owner.add(d1);
            d1.setOwner(this);
        }
    }

    public void removeDog(Dog d1){
        if(owner.remove(d1)){
            d1.setOwner(null);
        }
    }

    public ArrayList<Dog> getDogs(){
        return new ArrayList<Dog>(owner);
    }

    public User(String n){
        this.name = n;
    }

    public String getName(){
        return name;
    }

    public String toString(){

        return getName() + " " + getDogs();

    }

}

這里:

 private ArrayList<Dog> owner = new ArrayList<>();

那應該只是:

 private ArrayList<Dog> ownedDogs = new ArrayList<>();

然后,您可以添加(或刪除)屬於該用戶的狗。

最后:

public ArrayList<Dog> getDogs(){
    return new ArrayList<Dog

變成:

public ArrayList<Dog> getDogs(){
    return ownedDogs;
}

現在,每次調用getDogs()返回一個新的空列表。 這是沒有意義的,因為你已經有了“自有”狗的名單。 如果有的話,您可以考慮創建新列表(包含所有擁有的狗),然后分發出去。 但是返回一個空列表是沒有意義的!

關於stackoverflow:你必須確保那里沒有遞歸! 當向用戶添加狗時……將用戶添加為所有者,然后添加狗……您只需打破該鏈。

有趣的是,這是 OOP 處理狀態中的一個非常基本的問題:這里有“雙重簿記”,主人認識他的狗,所有的狗都認識他們的主人。 因此,以有意義的方式更新該信息實際上很難

真正的答案在這里:根據現實構建您的模型! 我的狗沒有內置財產,上面寫着“由 Ghostcat 擁有”。 我知道“這是我的狗”,某處有一些文件說“狗 X 歸鬼貓所有”。 換句話說:考慮刪除狗類的“所有者”字段。

這是我認為你應該如何解決這個問題的方法,首先是 Dog 類,為了清楚起見,我跳過了一些屬性。 toString只包含狗的名字(以及我跳過的其他狗的特定屬性),而不是我有一個特定的方法來獲取所有者的名字進行打印

public class Dog {
    String name;
    User owner;

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

    public String getName() { return name; }

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

    public User getOwner() { return owner; }

    public void setOwner(User owner) { this.owner = owner; }

    public String ownerAsString() {
        if (getOwner() != null) {
            return getOwner().toString();
        } else {
            return "<No Owner>";
        }
    }

    @Override
    public String toString() {
        return name;
    }
}

User 類有一個狗列表, toString方法只返回用戶名,而不是我有一個特定的方法來獲取擁有的狗作為字符串。 這是為了在打印時不會在 User 和 Dog 之間獲得循環引用。

public class User {
    String name;
    List<Dog> ownedDogs;

    public User(String name) {
        this.name = name;
        ownedDogs = new ArrayList<>();
    }

    public String getName() {
        return name;
    }

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

    public List<Dog> getOwnedDogs() {
        return ownedDogs;
    }

    public void setOwnedDogs(List<Dog> ownedDogs) {
        this.ownedDogs = ownedDogs;
    }

    public void addDog(Dog dog) {
        ownedDogs.add(dog);
        dog.setOwner(this);
    }

    public String ownedDogsAsString() {
        return ownedDogs.toString();
    }

    @Override
    public String toString() {
        return name;
    }
}

然后可以像這樣使用

User u = new User("abc");
Dog d1 = new Dog("D1");
Dog d2 = new Dog("D2");
u.addDog(d1);
u.addDog(d2);
System.out.println(u + " ownes " + u.getOwnedDogs());
System.out.print(d1 + " is owned by " + d1.ownerAsString());

輸出:

abc 擁有 [D1, D2]
D1歸abc所有

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM