Java中有沒有一種方法可以創建行內物件,例如在TypeScript中使用方括號,并在 Iterable 中使用它們?
如果這不可能,哪一種是實作此功能的最佳方式?
例子:
public Iterable<{ "month" : String, "hours" : double }> getHoursGroupByMonth(int userId);
uj5u.com熱心網友回復:
乍一看,TypeScript可能看起來與Java相似,但這是一種錯覺。TypeScript是JavaScript的超集。這些語言與 Java 非常不同。
在 Java 中,一切都是圍繞類構建的。要在 Java 中創建物件,您總是需要一個類(或enum或record,它們基本上是特殊型別的類),唯一的例外是陣列(它們是內置于語言中的,并且您不參考任何類實體化它們,但陣列是該Object型別的物件和實體)。您不能在 Java 中行內創建自定義物件。
相反,在 TypeScript 和 JavaScript 中,一切都是圍繞物件構建的。你可以行內創建物件,在 TypeScript 中你可以定義一個行內型別。繼承基于原型鏈(每個物件都有一個私有屬性,該屬性保存到另一個物件的鏈接)。所有這些機制對于 Java 來說都是陌生的。是的,類存在于 TypeScript 和最新版本的 JavaScript 中,但它們只是建構式的語法糖。
讓我們進入正題。您需要具有以下形狀的型別:
{ "month" : String, "hours" : double }
順便說一句:包中有一個列舉 ,優先使用s而不是字串是一個好習慣(因為列舉向您證明了普通字串無法提供的行為并防止您輸入錯誤)。Month java.time enum
Java 是靜態型別的。并且所有東西在編譯的時候都需要有一個型別。每個物件的“形狀”應該存在于某處,以便編譯器可以驗證它是否在您的代碼中被正確處理,并且您不會期望該物件具有它不具備的功能(JavaScript 原諒您這樣的事情,但 Java不是)。每種型別最終都會駐留在一個.class檔案中,JVM 在運行時可以使用該檔案。
正如我已經說過的,你不能定義行內型別。但這并不意味著您需要為每種型別創建一個單獨的檔案。在 Java 中,我們有嵌套類的概念。請注意,將兩個不相關的類相互嵌套不是一個好主意,通過在另一個類中宣告一個類,您是說封閉類以某種方式使用了嵌套類(或者至少代碼的讀者會期望)。
這就是您可以使用 Java 16記錄定義這種型別的方法:
public record MonthHours(Month month, double hours) {}
它相當于下面的類:
public class MonthHours {
private Month month;
private double hours;
public MonthHours(Month month, double hours) {
this.month = month;
this.hours = hours;
}
// getters, equals/hashCode, toString
}
uj5u.com熱心網友回復:
Java 不支持這種匿名物件型別。你必須為此創建一個類。
但是,您的方法名稱似乎表明月份是唯一的。這是Map<String, Double>一個可能的替代方案。地圖鍵是月份,值是小時。
可以通過以下幾種方式對地圖進行迭代:
使用
Map.forEach:hoursByMonth.forEach((month, hours) -> { ... });使用
Map.entrySet:// you can also use entrySet().stream, or entrySet().iterator() for (Map.Entry<String, Double> entry : hoursByMonth.entrySet()) { String month = entry.getKey(); double hours = entry.getValue(); }
uj5u.com熱心網友回復:
除了類和映射方法之外,我還建議使用介面方法 - 根據您的需要:
public interface MonthHoursProvider {
String month();
double hours();
}
或者你使用類似通用元組的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/495519.html
