我需要访问许多非常相似的对象以及其中的所有内容。到目前为止,我有三节课:

“片段”(Piece)-到目前为止什么都不做,但是由LcPawn继承。

“ LcPawn”-它具有一行代码,即“''public static int ID;''',对于LcPawn的每个实例,该代码应具有不同的编号。

“主要”-相关代码如下:

public static ArrayList<LcPawn> LcPawns = new ArrayList<LcPawn>(256);
for (int i = 0; i < 256; i ++) {
    LcPawns.add(i, new LcPawn());
}
for (int i = 0; i < LcPawns.size(); i ++) {
    LcPawns.get(i).ID = i;
}
for (int i = 0; i < LcPawns.size(); i ++) {
    System.out.println(LcPawns.get(i).ID);
}


但是,控制台上没有任何显示。单独的循环是这样,所以我可以确保它可以正常工作而不必一遍又一遍地重置所有对象。据我所知。

最佳答案

注意事项:

您的LcPawn类有一个变量public static int ID;,您说每个实例的值都应不同。在Java中,关键字static与此相反,它声明一个“类变量”,而不是一个“实例变量”。要为每个ID实例提供一个LcPawn实例,只需在此处删除static即可。

第二,值得坚持的约定是在提供“ getters and setters”的同时将所有字段都设为private。例如,与其声明一个类,如下:

public class MyClass {
    public int value;
}


而是将其声明为:

public class MyClass {
    private int value;

    public void setValue(int value) {
        this.value = value;
    }

    public int getValue() {
        return this.value;
    }
}


这有几个优点:


您可以将业务逻辑添加到功能中,例如也许您想在value字段中禁止使用负数。您可以添加一行:if (value < 0) throw new NegativeNumberException();
您可以更改实现而无需更改其余代码。也许您想从互联网上获得价值,或者您使用的库想要延迟加载变量。这只能通过方法调用来实现,而不能通过原始变量来完成。
许多流行的库都希望类采用这种格式(例如Jackson Databind和Spring)。


您还应该遵循标准的Java大写规则:


字段名称和方法写为likeThislikeThis()
类名称写为LikeThis
常量写为LIKE_THIS




考虑到这一点,这是我如何编写您的代码:

public static void main(String[] args) {
    List<LcPawn> pawns = new ArrayList<>(256);  // more generic type and type parameter omitted for brevity

    for (int i = 0; i < 256; i++) {
        pawns.add(new LcPawn());  // no need to specify an index, it gets added to the end by default
    }

    for (int i = 0; i < pawns.size(); i++) {
        pawns.get(i).setId(i);  // using setter method
    }

    for (int i = 0; i < pawns.size(); i++) {
        System.out.println(pawns.get(i).getId());  // using getter method
    }
}


但是,可以将其压缩为单个for循环:

List<LcPawn> pawns = new ArrayList<>(256);
for (int i = 0; i < 256; i++) {
    LcPawn pawn = new LcPawn();
    pawn.setId(i);
    System.out.println(pawn.getId());
    pawns.add(pawn);
}


或者,对于Java 8流:

IntStream.range(0, 256)  // generate a stream of integers from 0-255
    .map(i -> {  // map each integer to a pawn with that integer as its id
        LcPawn pawn = new LcPawn();
        pawn.setId(i);
        return pawn;
    })
    .forEach(System.out::println);  // print all of them, using a "method reference"

09-08 03:10