繁体   English   中英

如何在 java 中使用不同参数的构造函数之间交替?

[英]How to alternate between constructors with different parameters in java?

我有一个带有 2 个构造函数的 class,一个采用单个 object(鱼),另一个采用称为鱼(鱼)的对象数组。 有一个 function 可以将鱼添加到篮子中:

public Basket(int weight, Fish fishes) {
    singleFish = true;
}

public Basket(int weight, Fish[] fishes) {
    singleFish = false;
}


public boolean addFishes(Fish fish) {
    //here I want to make it so that when I add a fish to a basket,
    //it no longer uses the top constructor.
}

假设一个篮子以 1 条鱼开始,我怎样才能使它带一条鱼并在带一条鱼后使用第二个构造函数? 非常感谢。

除非我没有正确理解这个问题,否则为什么需要两次调用构造函数? 你可以使用这样的东西,你的Basket维护一个鱼列表,在实例化时创建它,然后根据需要添加鱼。 无需保留有关篮子中有多少鱼的任何信息,因为您可以从鱼的集合中推断出这一点。

class Basket {
    Collection<Fish> fishes;

    public Basket(Fish... fishes) {
        this.fishes = new ArrayList<>(Arrays.asList(fishes));
    }

    public void addFish(Fish... fishes) {
        this.fishes.addAll(Arrays.asList(fishes));
    }

    public boolean isSingleFish() {
        return this.fishes.size() == 1;
    }
}
public Basket(int weight, Fish fish) {
    this(weight, new Fish[] {fish};
    singleFish = true;
}

public Basket(int weight, Fish[] fishes) {
    singleFish = fishes.length == 1;
}

或者在这里你只需要一个带有可变参数的构造函数( Fish...Fish[]类型的实际):

private final Fish[] fishes;
private final boolean singleFish;

public Basket(int weight, Fish... fishes) {
    this.fishes = fishes;
    singleFish = fishes.length == 1;
}

new Basket(45, hering, sardine, riba);
new Basket(75, shark);
private ArrayList<Fish> fishes;

public Basket(Fish fish) {
    this(Collections.singletonList(fish));
}

public Basket(List<Fish> fishes) {
    this.fishes = fishes == null ? new ArrayList<>() : fishes;
}

public isSingle() {
    return fish.size() == 1;
}

public boolean addFishes(Fish fish) {
    fishes.add(fish);
}

要使用的构造函数是根据您传递给它的参数类型来选择的。

Fish数组与Fish本身是不同的类型。
在 Java 中,任何类型的任何数组都是它自己的类型。

因此,您所要做的就是传递一组Fish对象。
该数组可以为空,也可以只有一个 object,但必须是数组:

Fish [] fishes = new Fish[0];

Basket b = new Basket(0, fishes);

在此示例中,不传递一条鱼,但传递一个有效数组 object。
它甚至连一条鱼都没有空间,但这没关系。
它仍然是Fish[]类型的有效 object,因此将调用第二个构造函数。

请注意,您不能将null传递给Basket构造函数,因为编译器将不知道要选择哪个构造函数版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM