【问题标题】:Do Java records support "with" syntax?Java 记录是否支持“with”语法?
【发布时间】:2021-02-04 15:43:59
【问题描述】:

Java 14 带来了记录,这是许多函数式语言中的一个重要补充:

Java:

public record Vehicle(String brand, String licensePlate) {}

机器学习:

type Vehicle = 
  {
    Brand : string
    LicensePlate : string
  }

在 ML 语言中,可以通过创建一个更改了一些值的副本来“更新”记录:

let u = 
  {
    Brand = "Subaru"
    LicensePlate = "ABC-DEFG"
  }

let v =
  {
    u with 
      LicensePlate = "LMN-OPQR"
  }

// Same as: 
let v = 
  {
    Brand = u.Brand
    LicensePlate = "LMN-OPQR"
  }

这在 Java 14 中可行吗?

【问题讨论】:

  • 转到 Java 16。它们有一些不错的变化。答案是否定的
  • 很遗憾,答案是:还没有。
  • @texasbruce 不要使用 Lombok。它在引擎盖下做了非常讨厌的把戏
  • 本探索性文档中描述了“withers”的概念:Functional transformation of immutable objects
  • @texasbruce 只是不要。你让你的程序不那么面向未来。

标签: java java-14 java-record


【解决方案1】:

很遗憾,Java 不包含此功能。不过,您可以创建一个采用不同车牌值的实用程序方法:

public static Vehicle withLicensePlate(Vehicle a, String newLicensePlate) {
    return new Vehicle(a.brand, newLicensePlate);
}

这样使用:

Vehicle a = new Vehicle("Subaru", "ABC-DEFG");
Vehicle b = Vehicle.withLicensePlate(a, "LMN-OPQR");

这会给你一个与你尝试使用“with”标签类似的结果。您可以将其用作更新记录的一种方式。

【讨论】:

  • 正确的声明应该是public Vehicle(Vehicle a, String newLicensePlate) { this(a.brand, newLicensePlate); },但无论如何这是一个糟糕的模式。构造函数的参数类型不指示参数是新品牌还是新牌照,并且当两者具有相同类型时,两个元素的支持构造函数根本不起作用。更简洁的方法是在记录中添加一个 method,例如 public Vehicle withLicensePlate(String newLicensePlate) { return new Vehicle(brand, newLicensePlate); },可以像 Vehicle b = a.withLicensePlate("LMN-OPQR"); 一样使用
  • @Holger 我不太习惯 ML,并且正如 OP 所告知的,with 模式是在没有引入任何新方法的情况下预期开箱即用的东西。我几乎制定了与您的提案 here 类似的设计,但在我(现已删除)的回答中,我认为我无法真正达到 OP 的期望。
  • @Holger 建议是使用with 自动实现的。令人失望的是 Java 不支持这一点。当一个 PL 有“记录”时,通常假定这个特性。
  • @Naman 我知道 OP 要求一种不幸的是不存在的自动化(还没有?)。我只是回复了建议构造函数的答案,而方法会更好。
  • @Holger 以防万一你还没有厌倦了我向你询问只有你才能回答的问题(恕我直言),here 是一个
猜你喜欢
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多