Обратите внимание:
Ваш класс LcPawn
содержит переменную public static int ID;
, которая, как вы говорите, должна иметь разные значения для каждого экземпляра. В Java ключевое слово static
в этом контексте делает противоположное тому, что оно объявляет «переменную класса» вместо «переменной экземпляра». Чтобы обеспечить один экземпляр ID
для каждого экземпляра LcPawn
, просто удалите static
здесь, и это должно быть хорошо.
Во-вторых, следует придерживаться соглашения, согласно которому все поля 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;
}
}
Это имеет несколько преимуществ:
Вы можете добавить бизнес-логику c к функциям, например, возможно, вы хотите запретить отрицательные числа в поле value
. Вы можете добавить строку: if (value < 0) throw new NegativeNumberException();
Вы можете изменить реализацию без изменения остальной части вашего кода. Возможно, вы хотите получить свое значение из inte rnet, или вы используете библиотеку, которая хочет лениво загрузить вашу переменную. Это возможно только при вызове метода и не может быть сделано необработанной переменной.
Многие популярные библиотеки ожидают, что классы будут в этом формате (например, 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
l oop:
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"