因此,主要的动物类别将生成som母牛,但是实例化是在母牛类别中进行的。我的问题是:此代码模式真的“正常”吗?还是应该将Cow类重命名为“ CowHandler”,而是使用一个名为cow的子类?
CowHandler将具有一个字段List<Cow> cows;
,而Cow类仅String name;
实例化自身对于牛类来说感觉很奇怪,例如,从未在牛类中使用带有牛列表的字段。
这是到目前为止的代码:
动物类
import java.util.List;
public class Animal
{
public static void main(String[] args)
{
Animal animal = new Animal();
animal.init();
}
private void init()
{
Cow cow = new Cow();
int count = cow.getCows().size();
System.out.println("Cows in list before: " + count);
List<Cow> manyCows = cow.makeSomeCows();
for (Cow c : manyCows)
{
System.out.println(c.getName());
System.out.println("Children?: " + c.getCows().size());
System.out.println("");
}
count = cow.getCows().size();
System.out.println("Cows in list after: " + count);
}
}
牛类
import java.util.ArrayList;
import java.util.List;
public class Cow
{
private String name;
private List<Cow> cows;
public Cow()
{
cows = new ArrayList<Cow>();
}
public List<Cow> makeSomeCows()
{
for (int i=0; i<10; i++)
{
Cow cow = new Cow();
cow.name = "Tiny cow " + ((char)(i + 65));
cows.add(cow);
}
return cows;
}
public String getName()
{
return this.name;
}
public List<Cow> getCows()
{
return this.cows;
}
}
输出:
Cows in list before: 0
Tiny cow A
Children?: 0
Tiny cow B
Children?: 0
Tiny cow C
Children?: 0
Tiny cow D
Children?: 0
Tiny cow E
Children?: 0
Tiny cow F
Children?: 0
Tiny cow G
Children?: 0
Tiny cow H
Children?: 0
Tiny cow I
Children?: 0
Tiny cow J
Children?: 0
Cows in list after: 10
最佳答案
仅当每个private List<Cow> cows;
实例都有与之相关的Cow
列表(例如,该Cow
的子级)时,在Cow
类中具有Cow
实例变量才有意义。
如果目的是要包含您创建的所有Cow
的容器,则Cow
类中的实例变量是错误的,因为每个Cow
对象将具有其自己的List<Cow>
。
您可以在private static List<Cow> cows;
类中使用Cow
静态变量来保存所有Cow
实例,并使用相应的static
方法对其进行访问,但是将列表放在 s,例如Cow
。但是请注意,CowHandler
成为Cow
的子类没有任何意义。 CowHandler
不是Cow
。
关于java - Java OOP实例化自己还是添加子类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47388308/