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

标签 java class

我正在尝试在可以注册用户和狗的地方进行程序狗注册。 我所遇到的问题是使不同的类(class)一起工作。

我想做到这一点,以便用户可以有很多狗,但是狗只能有一个用户。

我希望能够在类(class)中的狗狗中检索狗和主人。

当我为我的用户类打电话时,它起作用,而不是从狗类类尝试时。

更新 我不明白的是,我将如何从狗类类中存储在用户类中的所有者?

中?

我做错了什么?

添加我的狗课

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

    }

}

最佳答案

我认为您应该解决这个问题,首先是 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 ownes [D1, D2]
D1 is owned by abc

关于Java类问题(一对多-多对一)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54535913/

相关文章:

javascript - Javascript 中是否需要类?它们对创建对象有什么影响?

java - 为什么 Oracle Java 提供的答案在寻址枚举集时使用私有(private)静态修饰符?

class - 类模块的子对象在 vba for excel 中不起作用

java - 为什么 TestExecutionListener 不能作为 bean 工作?

java - java中使用POI读取Excel

java - getMethod 避免父类

java - 如何运行 RCP Maven/Tycho 应用程序

iphone - 如何从单独的类更改 UIWindow 的颜色?

java - 让后台运行并持续关注网络连接的好方法是什么?

excel - VBA通过构造继承,构造函数不起作用?