问题标签 [immutables-library]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
555 浏览

java - intelliJ IDEA support for immutables with sbt

When using the java immutables library with IDEA and sbt, compilation and running code works fine, but the editor will give "Cannot resolve symbol ..." and "Cannot resolve method ..." errors when using the generated classes.

Following the documentation for setting up IDEs works fine for Maven, but doesn't solve the issues for sbt.

How can we get editor support and code completion working for generated sources on IDEA with sbt?

0 投票
1 回答
1204 浏览

java - 使用 Immutables 时将注解从接口继承到生成的 java 类

我在我的 Java 界面中使用 Immutables ( http://immutables.org ) 来生成构建器和不可变对象。我创建了一个名为 @Primary 的自定义方法级别注释(表示哪个属性是主字段),我用它来注释我在 Immutable 接口中的一个方法。我在由不可变对象创建的生成的 java 类中看不到注释。我尝试查看 BYOA(自带注释),但这无济于事。

有没有办法将 @Primary 注释放到生成的不可变 java 类上?

更新(基于肖恩的以下建议)

我现在有一个基于以下配置

包信息.java

主要注释

我在 package-info.json 中看到一个错误,其中说 MyStyle 应该在其自己的文件中声明。我不确定上面的配置是否正确。请你能告诉我哪里出错了吗?

0 投票
0 回答
79 浏览

java - immutables:我们应该使用 Interface 还是 ImmutableValueObject

问题是关于使用不可变Java 库。

在他们的文档中,他们似乎使用ImmutableValueObjectonly 来构造实例,然后在他们使用ValueObject(接口或抽象基类)的代码中,如下所示:

总是只使用 不是更好ImmutableValueObject吗?

例如:

特别是对于方法参数等,ValueObject不保证不变性(例如,有人可以只是子类化ValueObject并传递一个可变实例)。

通常,我想使用接口,因为我可以在测试中简单地使用不同的实现。但是对于不可变对象(它只是一个数据对象),我不需要这个:在测试中我只是按照它应该的方式准备我的对象。

还有其他原因,我失踪了吗?

0 投票
1 回答
1532 浏览

java - 为什么不鼓励不可变 null ?

我目前正在使用不可变库从我的 Web 应用程序生成 JSON 对象。

这一章,第一行说:

不鼓励使用可为空的属性。

所以我的问题是:

1)为什么?空对象有什么问题?

2) 如果我使用的是第三方对象的包装器并且我不知道 item 是否为空,那么使用分类构建器代码将失败怎么办:

有没有最优解?

编辑:

生成的json是:

如何完全删除空字段?

我读了这个,但是它使用 gson.toJson 返回一个 String 对象,这不是我想要的方式。

后编辑:

我刚刚发现Optional即使存在也不会显示真正的价值,但它只是显示真/假值,所以我不需要它。

0 投票
1 回答
534 浏览

java-8 - dropwizard 中的反序列化问题,无法转换 ImmutableList到字符串列表

我正在使用具有 java 8 功能的 dropwizard 1.1.0。我也在使用 Immutables 包。尝试将利润中心列表(字符串列表)从 JSON 转换为 java 等效项时,我遇到了反序列化问题。

错误

找不到非具体集合类型的反序列化器 [collection type; com.google.common.collect.ImmutableList 类,包含 [简单类型,类 java.lang.String]]

不可变的 Java 类

Immutables 将上述 DTO 生成到具有以下属性的最终类

在我的 dropwizard 应用程序引导程序中,我注册了以下模块

在我的 POM.xml 中,我将以下内容设置为我的依赖项

0 投票
1 回答
68 浏览

java - 在 Immutables 中强制执行特定的 Map 实现

我正在使用Immutables Java 库,如何强制执行特定的地图实现,而不必使用特定的引用?

如果我使用上面的代码,具体MapLinkedHashMap.

如果我使用上面的代码,参考和实现都是TreeMap.

有没有办法指定Map为参考但强制执行TreeMap为具体类型?

0 投票
1 回答
584 浏览

java - 通过 Guice 注入 Immutables 类

我正在使用 2 个常见的包,ImmutablesGuice。在运行时发生的第一件事是我将环境和其他来源的设置加载到一个单例、非不可变的配置类中,我们称之为它MyConfig,例如,公开一个公共getSettingX()方法。

我有一个抽象的不可变类,称之为AbstractImmutable。在实例化时需要设置一个基于myConfig.getSettingX().

现在,通常我MyConfig使用 Guice 注入到类中,并且想找到一种方法来实现类的实现(以避免每次构建对象时都AbstractImmutable必须手动注入类——整个原因是使用果汁开始,MyConfig管理我的 DI)。但是,由于具体的 Immutables 类是在编译时生成的,因此它不适用于通常的 Guice 注入注解。

Immutables 站点上有使用 builder 包注释静态工厂方法的指示,但我似乎无法弄清楚如何将其添加到抽象不可变类中。

有人有什么建议吗?

0 投票
0 回答
304 浏览

android-build - Immutables-library 两次生成相同的不可变类

在多模块 Android 应用程序中使用immutables.iopackage-info.java注释处理器时,使用文件时构建失败。

我已经设法在 GitHub 上构建了一个最小的测试项目来重现该问题: ImmutablesPackageInfoIssue

该项目由2个模块组成:

  • 应用程序:android应用程序:@Value.Immutable用于AndroidIm.java
  • lib:java模块:@Value.Immutable用于JavaIm.java

所以基本上,在两个模块中使用immutables.io都可以正常工作。
但是当我们添加一个package-info.java文件(到com.example package模块中app)时,编译失败并出现以下错误:

出现Dex错误,因为ImmutableJavaIm.java生成了两次:

  • 曾经在 lib 项目中(预期):
    \build\generated\source\apt\main\com\example\ImmutableJavaIm.java
  • 并且还在应用程序项目中(不应该发生):
    \build\generated\source\apt\debug\com\example\ImmutableJavaIm.java

已知的解决方法:

  • 删除package-info.java文件
  • 清除/注释掉它的内容
  • 配置构建以忽略package-info.java文件

注意:我不能忽略该文件,因为它包含构建的重要注释:例如不可变样式配置

任何想法为什么会发生这种情况或可能是什么原因?

0 投票
2 回答
2691 浏览

java - 我应该在单元测试中使用不可变对象的真实对象还是模拟对象?

如果我必须测试使用可变实体的服务,我将构建我需要的最小对象(真实对象)并将其传递给我的服务。例子:

显然用户有很多字段,但我没有设置它们,因为resetPasswordService不需要它们。这对重构非常友好,因为如果我重命名不是电子邮件的用户字段,则不会更改此测试。

当我尝试对Immutables对象执行相同操作时,就会出现问题。我将坚持使用相同的示例,并将 User 从实体转变为不可变的。

java.lang.IllegalStateException:无法构建用户,一些必需的属性没有设置 [postalAddress, signupDate, city, ....]

当构建器尝试构建对象时,它会失败。所以我该怎么做?

  • 为用户使用模拟并让它返回模拟,即使每次模拟返回模拟时,仙女都会死去
  • 创建一个测试 DSL 并拥有某种工厂来构建包含所有我不需要的字段的整个用户树结构?看起来很重,而且对重构不太友好。这使得测试的要求不那么透明。
  • 使用户中@Nullable的所有字段并让构建器不验证对象?这会使我面临在生产中拥有不完整对象的风险,对吧?
  • 我错过了其他选择?

我知道用户应该是实体而不是不可变的值对象。我在这个例子中使用了 User,因为它很容易理解。

0 投票
0 回答
339 浏览

java - 是否可以将 org.immutable:value 的构建器与 hibernate 的 @Entity 结合起来?

我真的很喜欢 immutables.github.io 的 immutables:value 注释处理器(@Value.Immutable, @Value.Modifiable, 等)。我有一个使用 hibernate 的项目,其中有很多实体。我很乐意让不可变库为我生成构建器。有没有人有幸实现这一目标?

说我有一个实体

有几种通用的方法似乎很明智:

  • 不知何故告诉@Value.Modifiable将注释应用于具体ModifiableEntity类型而不是即将成为抽象Entity类。
  • 告诉 hibernate 使用不同的具体类(有点类似于@JsonDeserialize(as=ModifiableEntity.class))。

但我不知道如何实现这两种方法。有谁知道一种可能有效的方法?