Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OOP实例化self还是添加子类?_Java_Oop - Fatal编程技术网

Java OOP实例化self还是添加子类?

Java OOP实例化self还是添加子类?,java,oop,Java,Oop,因此,主animal类将生成som cows,但实例化是在cow类中进行的。我的问题是:这个代码模式真的“ok”吗?或者cow类应该被重命名为“CowHandler”,而不是有一个名为cow的子类 CowHandler将有一个字段列出奶牛和仅Cow类字符串名称 cow类实例化自己感觉很奇怪,例如,cow类中从未使用包含cows列表的字段。 以下是截至目前的代码: 动物类 import java.util.List; public class Animal { public static

因此,主animal类将生成som cows,但实例化是在cow类中进行的。我的问题是:这个代码模式真的“ok”吗?或者cow类应该被重命名为“CowHandler”,而不是有一个名为cow的子类

CowHandler将有一个字段
列出奶牛和仅Cow类<代码>字符串名称

cow类实例化自己感觉很奇怪,例如,cow类中从未使用包含cows列表的字段。 以下是截至目前的代码:

动物类

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

}

拥有
私有列表Cow
类中的code>实例变量只有在每个
Cow
实例都有一个与之相关的
Cow
列表时才有意义(例如,该
Cow
的子对象)

如果目的是拥有一个包含您创建的所有
Cow
的容器,则
Cow
类中的实例变量是错误的,因为每个
Cow
对象都有自己的
列表


您可以使用
私有静态列表
Cow
类中的code>静态变量,用于保存所有的
Cow
实例,并使用相应的
静态
方法来访问它,但是将列表放在
Cow
的单独容器中更为合理,例如
CowHandler
。但是,请注意,
Cow
作为
CowHandler
的子类是没有意义的。
Cow
不是
Cowhandler

是的,将其作为子类也没有多大意义,因为Cow不是Cowhandler。奶牛是一种动物……我想我可以把
List cows=new ArrayList(),因为还没有Cow有关系。因此,在cow类中创建cow对象很好?@BakedInhalf您是说
列表
将不再是
cow
类的实例变量吗?是的,没有禁止在Cow类中创建Cow对象的规则。唯一的潜在缺点是,如果您有Cow的子类,并且希望您的
列表
包含这些子类的对象,
Cow
将不是创建它们的好地方,因为类不应该知道它的子类。是的,
List
将不再是Cow的实例变量。我看到的一个缺点是,我无法从动物类中获得所有的奶牛。我看到了一个场景,我想为cows添加更多的逻辑,并添加或更新它们的属性。例如,除Animal之外的一个类可能希望访问所有奶牛。我可以在班级之间传递一个列表,但这可能不理想?
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