我正在尝试制作程序狗注册,您可以在其中注册用户和狗。 我遇到的问题是使不同的类一起工作。
我想做到这一点,以便用户可以有很多只狗,但是狗只能有一个用户。
我希望能够在类的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();
}
}
答案 0 :(得分: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()
每次调用时都会返回一个新的空列表。这没有任何意义,因为您已经有了“自备”狗的清单。如果有的话,您可以考虑创建新列表(包含所有拥有的狗),并将其分发出去。但是返回空列表毫无意义!
关于stackoverflow:您必须确保那里没有递归!将狗添加到用户时...将用户添加为所有者,添加狗...您只需要断开该链即可。
有趣的是,这是OOP处理状态中的一个非常基本的问题:您在这里有“双重簿记”,主人认识他的狗,所有的狗都知道他们的主人。因此,以有意义的方式更新该信息实际上困难。
真正的答案是:根据实际情况构建模型!我的狗没有建有“由Ghostcat拥有”的房屋。我知道“这是我的狗”,并且某处有纸写着“狗X由Ghostcat拥有”。换句话说:考虑删除狗类的“所有者”字段。
答案 1 :(得分: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
方法仅返回用户名,相反,我有一个特定的方法将拥有的狗作为字符串获取。这是为了在打印时不会在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拥有