У меня есть этот класс под названием 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
}
]
Ваш дизайн неправильный. Вам не нужен пользователь, у которого есть пользователь, который является списком объектов. Вам нужен список пользователей (например, <List<User>), где каждый пользователь является объектом, имеющим имя пользователя (т.е. поле типа String с именем userName).
В вашем классе add нет метода User. Ваш код не работает ..
Проблема в том, что я сделал это, потому что не хочу указывать тип для userName!
Это бессмысленно. Каким типом, кроме String, может быть имя пользователя? Ни одного пользователя никогда не назовут 456 или true.
У меня в качестве примера есть user userName. Представьте, что это не имя пользователя, если это помогает. Он должен содержать разные типы.
Как насчет того, чтобы задать вопрос, четко объясняющий, чего вы на самом деле хотите достичь, вместо того, чтобы позволить нам угадать, что это может быть?
Я привел пример того, чего пытаюсь достичь. Вы все начали помещать String в свойство userName ... Я сказал: «... важно то, что я не хочу указывать типы, потому что они могут различаться». Мне просто нужна помощь, а не обсуждение того, почему userName будет содержать другие типы, кроме String. Тогда давайте назовем это dynamicProperty, а не userName ...
Затем введите его как Object. Но это, вероятно, приведет к множеству других проблем: как код узнает, что это за объект? Как вы предотвратите сохранение в userName чего-то, что нельзя сериализовать в JSON? Как вы десериализуете JSON? Если бы вы сказали нам, чего хотите достичь, на более высоком уровне, мы могли бы оказать реальную помощь. И тот факт, что вы еще не нашли основную информацию о классах, структурах данных и именовании, заставляет нас думать, что ваш дизайн, вероятно, тоже не тот. Но поскольку мы не знаем, что вы пытаетесь создать ...
как может варьироваться тип имени пользователя? Разве имя пользователя всегда будет строкой? Что еще вы ожидаете от этого? Вы имеете в виду, что тип Пользователь может отличаться (а не название)? Это нормально, но если вы поместите что-то в список Object, вы потеряете любую информацию о том, какого типа это было изначально. Поэтому, когда вы снова получите его, вам нужно знать, к какому типу он был первоначально, и привести его к этому типу, прежде чем вы сможете использовать его осмысленно. Возможно, если у вас есть разные типы пользователей, вам нужно какое-то наследование или интерфейс, или просто один тип с некоторыми необязательными полями.
Как бы то ни было, я согласен с предыдущими комментариями, это запах кода, который, как я подозреваю, исходит из плохо спроектированной модели данных.
Скажем, объект фактически содержит только имя и значение для предпочтения. Он может варьироваться, потому что {preferenceName: 'Default Date', preferenceValue: '05 / 07/2020 '}, {preferenceName:' Default Number ', preferenceValue: 55}, {preferenceName:' goToHomepage ', preferenceValue: true}. Вы видите, как preferenceValue можно повторно использовать во многих сценариях?




Вы, кажется, нуждаетесь
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.
@ MuratKaragöz, правда, но это достаточно ясно, чтобы показать, что было бы нормальным поступком.
@LazioTibijczyk, вы говорите, что понятия не имеете, какие атрибуты могут быть у пользователя?
Я говорю, что userName может в конечном итоге содержать типы, отличные от String, поэтому я не хочу его указывать.
@LazioTibijczyk См. Мой второй пример, в котором разрешены произвольные атрибуты. Любое имя пользователя, не являющееся String, можно рассматривать как String.
У меня был бы класс
Users, в котором есть списокUser, где каждый пользователь - это всего лишь один человек.