簡體   English   中英

我可以在 object 中輸入多個值嗎?

[英]Can I put multiple values in object?

我想要一個具有多個值的 object 和一個字符串列表。 例如食譜:食譜是存儲在 arraylist 中的對象。 每個 object 都應該有一個名稱、一個 boolean (isVeggie) 以及所有成分和相關數量的列表。

我想到了 object 中的其他 arraylist,但我無法訪問 object 上的列表。

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;

當然,您可以創建 arrays 或將其列為另一個 object 中的屬性。 考慮以下示例:

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;
    }
}

Class User包含昵稱列表。 您可以創建一個User object 並訪問它的屬性,如下所示:

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

tl;博士

定義一個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() 

細節

謝爾蓋的回答是正確的,應該被接受。 我將添加一些想法。

命名約定

請注意 Java 中的命名約定,因為它們使您的代碼更易於閱讀。 因此,您的 class 名稱應以大寫字母開頭。 在您的情況下,以單數命名更有意義。 所以: Recipe

BigDecimal

在實際工作中,永遠不要使用精度很重要的浮點類型。 浮點技術犧牲了執行速度的准確性

因此,為了錢等,請使用BigDecimal class 而不是double

多態性:使用更通用的接口/超類

將您的成分列表屬性定義為更通用的接口List ,而不是始終將其承諾為具體的 class ArrayList

不可修改的列表

如果您不打算允許調用程序員進行更改,請使用不可修改的列表填充該成分列表。

記錄

如果您的 class 的主要目的是透明且不可變地攜帶數據,則將 class 定義為記錄 只需聲明您的成員字段。 編譯器隱式創建構造函數、getter、 equals & hashCodetoString

您的整個 class 定義變為這一行:

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 ) ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM