Как сделать ArrayList внутри класса и почему так? - PullRequest
0 голосов
/ 04 августа 2020

Я создаю простую игру, в которой у меня есть класс User, в котором я храню пользовательские данные. Существует определенный тип c данных, который я хочу сохранить в ArrayList и куда я хочу добавлять данные во время игры. Ниже вы можете увидеть, как я думал, что должен написать это, но, видимо, это не так. Почему нет? Как мне это сделать правильно и почему так? Я искал в inte rnet, но не нашел.

public Class User {
    List positions;
}
User x = new User;
x.positions = new ArrayList;

x.positions.add(1);
x.positions.add(2);

Ответы [ 3 ]

2 голосов
/ 04 августа 2020

Во-первых, вы должны сделать позиции приватными. Во-вторых, вам нужно сделать соответствующие методы publi c getter и setter для позиций.

См. Пример ниже: Class User (пакет опущен):

import java.util.ArrayList;
import java.util.List;

public class User {
    private List<Integer> positions = new ArrayList<>();

    public List<Integer> getPositions() {
        return positions;
    }

    public void setPositions(List<Integer> positions) {
        this.positions = positions;
    }
}

Class Main (пакет опущен):

import java.util.ArrayList;
import java.util.List;

public class MainApp {
    public static void main(String[] args) {
        User user = new User();
        user.getPositions().add(1);
        user.getPositions().add(2);

        // another way
        List<Integer> positions = user.getPositions();
        positions.add(3);

        // another way
        List<Integer> myNewList = new ArrayList<>();
        myNewList.add(4);
        myNewList.add(5);
        myNewList.add(6);
        // below will replace list 123 with 456
        user.setPositions(myNewList);
    }
}
1 голос
/ 04 августа 2020

Я бы изменил List на ArrayList<T>, где T - это тип объекта, поэтому у него есть ограничение на то, что можно в нем хранить. Кроме того, в своем классе вы хотите настроить его так, чтобы у вас были частные переменные с сеттерами и геттерами для доступа к переменным.

Я также включил блок инициализатора, который создает ArrayList, и этот блок инициализатора вызывается при каждом создании нового объекта User, даже если у вас есть несколько конструкторов в классе. Без создания ArrayList он будет нулевым.

public class User {
    private ArrayList<T> positions;

    public ArrayList<T> getPositions() {
        return this.positions;
    }

    public void setPosition(ArrayList<T> position) {
        this.position = position;
    }

    // Initializer block
    {
        this.position = new ArrayList<>();
    }
}

С этим вы можете затем вызвать x.getPosition.add(), чтобы добавить позиции, просмотреть позиции, удалить позиции и т. Д. c.

0 голосов
/ 04 августа 2020

Немногое:

  1. Создайте экземпляр ArrayList с правильным конструктором ( на данный момент ваш код не компилируется, так как вы не вызываете конструктор. Это должно быть new ArrayList<T>(););

  2. Определите более конкретную c степень детализации для вашего List и объявите его с помощью параметра типа Generi c, например List<TypeYouWantToStore>. В противном случае ваш список имеет необработанный тип и не будет иметь никаких ограничений на то, что вы храните в нем;

  3. Определите аксессоры ( геттеры) и мутаторы (сеттеры) для вашего поля List вместо прямого доступа к нему как к полю public. Затем у вас будет:

    x.getPositions().add(1);
    
  4. Я бы инициализировал ваше поле List из конструктора класса User.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...