java - 从 arrayList 索引访问类字段?

标签 java class variables arraylist

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

“Piece” - 到目前为止什么也没做,但被 LcPawn 子类化。

“LcPawn” - 这有一行代码,'''public static int ID;''' 应该为 LcPawn 的每个实例保存不同的编号。

“Main” - 有问题的代码如下:

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这里和那个应该没问题。

其次,一个值得遵守的约定是将所有字段设置为 private ,同时提供“getter 和 setter”。例如,不要按如下方式声明类:

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 中的负数 field 。您可以添加一行: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"

关于java - 从 arrayList 索引访问类字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59924449/

相关文章:

java - 每 2 小时在 n 到 m 范围内的随机分钟触发一次 Jenkins 作业

C++ 类变量作用域

JQuery 如果标签包含这个...执行此操作

java - 在开发模式下生成 JasperReport 时出错

java - 使用 xml 属性在 java 中进行 XML 到 JSON 的转换

java - 如何实现最近使用的缓存

Java 检查变量是否已初始化

具有成员函数的 C++ 结构与具有公共(public)变量的类

android - 从开头删除加号并替换数字的空格

c++ - "\n"算一个字符还是两个字符,可以存成char吗?