Java类问题(一对多 - 多对一)?

问题描述 投票:2回答:2

我试图做一个节目狗寄存在那里你可以注册用户和狗。说我遇到的问题是,使不同类别的共同努力。

我希望把它使用户可以有很多狗,但狗只能有一个用户。

我希望能够找回狗,并在班的toString所有者。

当我调用了toString我的User类它的工作原理,但不是当我尝试从狗类。

更新我不明白的事情是我要如何当它存储在用户类从狗类访问主人?

我究竟做错了什么?

加入我的狗类

    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();
    }
}

User类

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();

    }

}
java class
2个回答
1
投票

这里是我怎么想,我已经跳过了清晰的几个属性,你应该解决这个问题,首先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方法只返回用户名称,而不是我有一个具体的方法来获取所有的狗作为一个字符串。这是在打印时无法获得用户和狗之间的循环引用。

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 ownes [D1,D2] D1是由ABC拥有


1
投票

这里:

 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()返回每个调用它一个新的空单。这是没有意义的,因为你已经拥有的“拥有”狗名单。如果在所有的,你可以考虑创建新的列表(包含所有拥有狗),并用手指出。但在返回一个空列表是没有意义的!

关于计算器:你必须确保没有递归那里!当添加一个狗用户...,增加了用户作为所有者,它增加了狗......你只需要向上突破该链。

有趣的是,这是OOP处理状态一个非常基本的问题:你有“双簿记”在这里,店主知道他的狗,和所有的狗都知道它们的主人。因此,以有意义的方式更新该信息实际上是困难的。

这里真正的答案是:根据实际建立模型!我的狗不具有内置的属性,上面写着“通过Ghostcat拥有”。我知道“这是我的狗”,并有一些地方纸,上面写着“狗X由Ghostcat拥有”。换句话说:考虑删除“所有者”字段的狗类。

© www.soinside.com 2019 - 2024. All rights reserved.