【问题标题】:Can I put multiple values in object?我可以在对象中放置多个值吗?
【发布时间】:2022-01-15 10:49:41
【问题描述】:

我想要一个具有多个值的对象,并且在一个值中包含一个字符串列表。

例如一本食谱:

  • 配方是存储在数组列表中的对象。
  • 每个对象都应该有一个名称、一个布尔值 (isVeggie) 以及所有成分和相关数量的列表。

我想到了对象内部的其他数组列表,但我无法访问对象上的列表。

public String name;
public double cost;
public boolean isClassic;
public boolean isVeggie;
public boolean isVegan;
protected ArrayList<String> ingredients  = new ArrayList<String>();

    
public recipes (String name, double cost, boolean isClassic, boolean isVeggie, boolean isVegan,
        ArrayList<String> ingredients) {
    super();
    this.name = name;
    this.cost = cost;
    this.isClassic = isClassic;
    this.isVeggie = isVeggie;
    this.isVegan = isVegan;
    this.ingredients = ingredients;

【问题讨论】:

  • 如果你把配料表公开怎么办?
  • 不幸的是同样的结果
  • 我也可以用字符串填充列表,但每个对象的成分相同。
  • 我没有看到语言标签。那是Java吗?
  • 您的问题非常令人困惑,当您的意思是“财产”时,您似乎使用了“价值”。试着用一个更好的例子来重写你的问题,说明你想要实现什么,什么阻碍了你。

标签: java arrays object


【解决方案1】:

tl;博士

你问:

甚至可以将数组列表存储到对象中吗?

是的。使用类型ArrayList 定义一个成员变量。

这里我们定义一个record。将List 指定为成员字段之一。

public record Recipe ( String name, double cost, boolean isClassic, boolean isVeggie, boolean isVegan, List< String > ingredients ) {}

使用List.of 填充。

new Recipe(                     // Defined as `public record Recipe`. 
    "Beans & Rice", 
    0.99d, 
    true , 
    true, 
    true, 
    List.of( "beans", "rice" )  // `List.of` produces an object of type `List` using an unspecified concrete class. 
) 

访问成分列表。

myRecipe.ingredients() 

详情

Answer by Sergey 是正确的,应该被接受。我会补充一些想法。

命名约定

请注意 Java 中的命名约定,因为它们使您的代码更易于阅读。所以你的班级名称应该以大写字母开头。在您的情况下,以单数命名更有意义。所以:Recipe.

BigDecimal

在实际工作中,切勿在精度很重要的情况下使用浮点类型。浮点技术trades away accuracy 提高执行速度。

所以为了钱等,使用BigDecimal类而不是double

多态性:使用更通用的接口/超类

将您的成分列表属性定义为更通用的接口List,而不是将其始终作为具体类ArrayList

不可修改的列表

如果您不打算允许调用程序员进行更改,请使用不可修改的列表填充该成分列表。

记录

如果您的类的主要目的是透明且不可变地携带数据,则将该类定义为record。只需声明您的成员字段。编译器隐式创建构造函数、getter、equals & hashCodetoString

你的整个类定义变成了这一行:

public record Recipe ( 
    String name, 
    BigDecimal cost, 
    boolean isClassic,  
    boolean isVeggie, 
    boolean isVegan, 
    List<String> ingredients 
) {}

示例

示例用法。

Recipe beansAndRice = new Recipe( "Beans & Rice", new BigDecimal( "0.99" ), true , true, true, List.of( "beans", "rice" ) ) ;

要访问成分列表,请调用隐式生成的访问器方法,其名称为属性名称(无get 前缀)。

List< String > ingredients = beansAndRice.ingredients() ;

要制作列表的可修改副本,请传递给ArrayList 的构造函数。

List< String > ingredientsToModify = new ArrayList<>( ingredients ) ;

【讨论】:

    【解决方案2】:

    当然,您可以在另一个对象中创建数组或列表作为属性。考虑以下示例:

    public class User {
        private String name;
        private List<String> nicknames;
    
        public User(String name, List<String> nicknames) {
            this.name = name;
            this.nicknames = nicknames;
        }
    
        public String getName() {
            return name;
        }
    
        public List<String> getNicknames() {
            return nicknames;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setNickNames(List<String> nicknames) {
            this.nicknames = nicknames;
        }
    }
    

    User 类包含一个昵称列表。您可以创建一个User 对象并访问它的属性,如下所示:

    User user = new User("RealName", Arrays.asList("nickname1", "nickname2"));
    List<String> userNicknames = userr.getNicknames();
    userNicknames.add("nickname3");
    

    【讨论】:

    • 谢谢!效果很好,但是如何在这个例子中添加更多昵称?
    • 请看我编辑的答案,可以拨打userNicknames.add("nickname3");
    猜你喜欢
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2018-06-10
    • 1970-01-01
    • 2015-02-23
    • 2013-06-27
    • 1970-01-01
    相关资源
    最近更新 更多