java - 从arrayList索引访问类字段?
问题描述
我需要访问许多非常相似的对象以及其中的所有内容。到目前为止,我有三个课程:
“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
其次,一个值得坚持的约定是让所有字段private
,同时提供“getter and 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
您可以将业务逻辑添加到函数中,例如,您可能希望在字段中禁止负数。您可以添加一行:if (value < 0) throw new NegativeNumberException();
您可以在不更改其余代码的情况下更改实现。也许您想从互联网上获取您的价值,或者您使用想要延迟加载变量的库。这只能通过方法调用实现,而不能通过原始变量完成。
许多流行的库都希望类采用这种格式(例如 Jackson Databind 和 Spring)。
您还应该遵循标准的 Java 大写规则:
- 字段名称和方法被写入
likeThis
和likeThis()
- 类名是写的
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"
推荐阅读
- python - 如何修复python中的警告:此代码无法访问
- icalendar - ICS文件中的X-LIC-LOCATION是什么意思?
- ios - 为什么代码覆盖率功能区在源代码编辑器上不可见?
- laravel - Twilio - 单击链接将启动出站呼叫
- python - 如何根据kivy列表中的值数生成按钮?
- sql - SQL Server:NULL 还是空字符串?
- excel - 我需要一个公式来返回开头有大写字母和结尾有数字的范围内的单元格
- mysql - 从 MySQL 获取股市数据并向所有用户显示的最佳方法?
- python - /check-out 处的 TypeError 获取 dict 值,但我想要 dict 和指定值
- laravel - 在 Laravel 中发送 GSuite 电子邮件