在 java 中高效地创建多种类型的对象数组

问题描述 投票:0回答:1

我想创建多个对象的数组/数组列表/列表/映射(不确定使用哪个),这将是多个类的实例。如何在不为每种对象类型编写单独的 for 循环的情况下执行此任务? 有点像一副纸牌,但有多种纸牌。在我的示例中,类别 1 到 4 扩展自抽象类 Card。到目前为止,他们所有人的唯一功能是打印他们的名字。我知道我需要一个超类的数组列表,但是我如何以简洁的方式调用子类?

基本上我有这个,但看起来不对。不确定使用什么以及从哪里开始,对 Java 有点陌生。谢谢!

public class Array{

    ArrayList<Card> deck = new ArrayList<Card>();

    public fillArray() {

        for (int i = 0; i < 10; i++) {
            deck.add(new Category1());
        }
        for (int i = 0; i < 20; i++) {
            deck.add(new Category2());
        }
        for (int i = 0; i < 5; i++) {
            deck.add(new Category3());
        }
        for (int i = 0; i < 8; i++) {
            deck.add(new Category4());
        }
        
    }
    public void printArray() {
        int k = 1;
        for (Card card : this.deck) {
            System.out.println(k+". "+card.getName());
            k++;
        }
    }
}

我尝试过使用数组/数组列表,但从未让它们正确调用类来构造对象。

java arrays list object oop
1个回答
2
投票

正如 rzwiterloot 所说,您当前的代码清晰简洁。

让你的代码更清晰的一个改进是调用你的类

Array
,它也被JDK使用。

如果你想让你的代码更简洁,但不太清晰,你可以创建一个添加卡片的方法:

import java.util.ArrayList;
import java.util.function.Supplier;

public class Test {
    ArrayList<Card> deck = new ArrayList<Card>();

    public void fillArray() {
        addCards(10, () -> new Category1());
        addCards(20, () -> new Category2());
        addCards(5, () -> new Category3());
        addCards(8, Category4::new); // this is exactly the same as () -> new Category4()
    }
    
    private void addCards(int howMany, Supplier<Card> cardFactory) {
        for (int i = 0; i < howMany; i++) {
            deck.add(cardFactory.get());
        }
    }
    
    public void printArray() {
        int k = 1;
        for (Card card : this.deck) {
            System.out.println(k+". "+card.getName());
            k++;
        }
    }
}

class Card { public String getName() { return "";}}
class Category1 extends Card {}
class Category2 extends Card {}
class Category3 extends Card {}
class Category4 extends Card {}

但重申一下:您当前的代码很好。如果上面的代码对你来说比较难理解,请不要使用它。

如果它删除了重复的代码,那么创建这样的方法是很好的,但是您没有明显的重复代码。

© www.soinside.com 2019 - 2024. All rights reserved.