Добавить свойства в ArrayList <Object> в Java

У меня есть этот класс под названием Preferences. Как я могу поместить объект в этот ArrayList?

package example;

import java.util.ArrayList;

public class Preferences {
    public Preferences() {
        super();
    }

    ArrayList<Object> preferences;

    public void setPreferences(ArrayList<Object> preferences) {
        this.preferences= preferences;
    }

    public ArrayList<Object> getPreferences() {
        return preferences;
    }
}

В моем основном методе я делаю так:

package example;

public class Runner {
    public Runner() {
        super();

        Preferences preferences = new Preferences();

    }

    public static void main(String[] args) {
        Runner runner = new Runner();
    }
}

Я хочу получить ArrayList этих объектов, которые выглядят следующим образом (важный момент в том, что я не хочу указывать типы, потому что они могут различаться). Я хочу, чтобы preferenceValue можно было использовать повторно.

[
   {
       preferenceName: "Default Date",
       preferenceValue: "05/07/2020"
   },
   {
       preferenceName: "Default Number",
       preferenceValue: 55
   },
   {
       preferenceName: "goToHomePage",
       preferenceValue: true
   }
]

У меня был бы класс Users, в котором есть список User, где каждый пользователь - это всего лишь один человек.

Peter Lawrey 02.11.2018 11:01

Ваш дизайн неправильный. Вам не нужен пользователь, у которого есть пользователь, который является списком объектов. Вам нужен список пользователей (например, <List<User>), где каждый пользователь является объектом, имеющим имя пользователя (т.е. поле типа String с именем userName).

JB Nizet 02.11.2018 11:01

В вашем классе add нет метода User. Ваш код не работает ..

Murat Karagöz 02.11.2018 11:02

Проблема в том, что я сделал это, потому что не хочу указывать тип для userName!

LazioTibijczyk 02.11.2018 11:02

Это бессмысленно. Каким типом, кроме String, может быть имя пользователя? Ни одного пользователя никогда не назовут 456 или true.

JB Nizet 02.11.2018 11:03

У меня в качестве примера есть user userName. Представьте, что это не имя пользователя, если это помогает. Он должен содержать разные типы.

LazioTibijczyk 02.11.2018 11:05

Как насчет того, чтобы задать вопрос, четко объясняющий, чего вы на самом деле хотите достичь, вместо того, чтобы позволить нам угадать, что это может быть?

JB Nizet 02.11.2018 11:06

Я привел пример того, чего пытаюсь достичь. Вы все начали помещать String в свойство userName ... Я сказал: «... важно то, что я не хочу указывать типы, потому что они могут различаться». Мне просто нужна помощь, а не обсуждение того, почему userName будет содержать другие типы, кроме String. Тогда давайте назовем это dynamicProperty, а не userName ...

LazioTibijczyk 02.11.2018 11:08

Затем введите его как Object. Но это, вероятно, приведет к множеству других проблем: как код узнает, что это за объект? Как вы предотвратите сохранение в userName чего-то, что нельзя сериализовать в JSON? Как вы десериализуете JSON? Если бы вы сказали нам, чего хотите достичь, на более высоком уровне, мы могли бы оказать реальную помощь. И тот факт, что вы еще не нашли основную информацию о классах, структурах данных и именовании, заставляет нас думать, что ваш дизайн, вероятно, тоже не тот. Но поскольку мы не знаем, что вы пытаетесь создать ...

JB Nizet 02.11.2018 11:11

как может варьироваться тип имени пользователя? Разве имя пользователя всегда будет строкой? Что еще вы ожидаете от этого? Вы имеете в виду, что тип Пользователь может отличаться (а не название)? Это нормально, но если вы поместите что-то в список Object, вы потеряете любую информацию о том, какого типа это было изначально. Поэтому, когда вы снова получите его, вам нужно знать, к какому типу он был первоначально, и привести его к этому типу, прежде чем вы сможете использовать его осмысленно. Возможно, если у вас есть разные типы пользователей, вам нужно какое-то наследование или интерфейс, или просто один тип с некоторыми необязательными полями.

ADyson 02.11.2018 11:12

Как бы то ни было, я согласен с предыдущими комментариями, это запах кода, который, как я подозреваю, исходит из плохо спроектированной модели данных.

ADyson 02.11.2018 11:13

Скажем, объект фактически содержит только имя и значение для предпочтения. Он может варьироваться, потому что {preferenceName: 'Default Date', preferenceValue: '05 / 07/2020 '}, {preferenceName:' Default Number ', preferenceValue: 55}, {preferenceName:' goToHomepage ', preferenceValue: true}. Вы видите, как preferenceValue можно повторно использовать во многих сценариях?

LazioTibijczyk 02.11.2018 11:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
12
2 586
1

Ответы 1

Вы, кажется, нуждаетесь

public class User {
    private final String userName;
    public User(String userName) {
        this.userName = userName;
    }

    public String getUserName() {
        return userName;
    }
}

public class Runner {
    final List<User> users = new ArrayList<>();

    public Runner() {
        users.add(new User("User 1"));
        users.add(new User("User 2"));
    }

    public static void main(String[] args) {
        Runner runner = new Runner();
    }
}

It has to hold different types.

Если у вас есть запись пользователя, но вы не знаете, какими могут быть атрибуты или их значения, вы можете использовать карту.

public class User {
    private final Map<String, Object> attributes;
    public User(Map<String, Object> attributes) {
        this.attributes= attributes;
    }
    public User(String key, Object value, Object... keysAndValues) {
        this(new LinkedHashMap<>());
        attributes.put(key, value);
        for (int i = 0; i < keysAndValues.length; i += 2)
            attributes.put((String) keysAndValues[i], keysAndValues[i+1]);
    }

    public Map<String, Object>getAttributes() {
        return attributes;
    }
}

public class Runner {
    final List<User> users = new ArrayList<>();

    public Runner() {
        users.add(new User("userName", "User 1", "favouriteNumber", 7));
        users.add(new User("userName", "User 2", "colour", Color.BLUE));
    }

    public static void main(String[] args) {
        Runner runner = new Runner();
    }
}

Здесь я предполагаю, что имена ваших атрибутов имеют тип String. Например, если вы используете YAML, он может иметь любой тип в качестве атрибута, поэтому вы можете просто использовать Object.

{ preferenceName: 'Default Date', preferenceValue: '05/07/2020' }, 
{ preferenceName: 'Default Number', preferenceValue: 55 }, 
{ preferenceName: 'goToHomepage', preferenceValue: true }

Я бы структурировал это как

new User("Default Date", LocalDate.parse("05/07/2020", DateTimeFormatter.ofPattern("dd/MM/yyyy")),
         "Default Number", 55,
         "goToHomepage", true);

Однако в идеале вы должны заранее знать возможные атрибуты и использовать User, который выглядит как

class User {
    LocalDate defaultDate;
    long defaultNumber;
    boolean goToHomepage;
}

«... важно то, что я не хочу указывать типы, потому что они могут различаться». Я хочу использовать массив объектов не в том, чтобы определять userName как String.

LazioTibijczyk 02.11.2018 11:03

@ MuratKaragöz, правда, но это достаточно ясно, чтобы показать, что было бы нормальным поступком.

Peter Lawrey 02.11.2018 11:04

@LazioTibijczyk, вы говорите, что понятия не имеете, какие атрибуты могут быть у пользователя?

Peter Lawrey 02.11.2018 11:05

Я говорю, что userName может в конечном итоге содержать типы, отличные от String, поэтому я не хочу его указывать.

LazioTibijczyk 02.11.2018 11:06

@LazioTibijczyk См. Мой второй пример, в котором разрешены произвольные атрибуты. Любое имя пользователя, не являющееся String, можно рассматривать как String.

Peter Lawrey 02.11.2018 11:10

Другие вопросы по теме