标签: java-record

Java Records 是否真的通过类似的类声明来节省内存,或者它们更像是语法糖?

我希望 Java 14 记录实际上比类似的数据类使用更少的内存。

他们或内存使用相同吗?

java memory-footprint java-14 java-record

9
推荐指数
2
解决办法
734
查看次数

jlink:ed 应用程序中的记录抛出异常

在 jlink:ed 应用程序中使用记录(预览功能 java-14),在使用选项时会出现以下错误:

options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']

java.lang.ClassFormatError: Invalid constant pool index 11 for name in Record attribute in class file 
myproj/MyClass$MyRecord
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(Unknown Source)
    at java.base/java.lang.ClassLoader.defineClass(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

java jlink preview-feature java-14 java-record

9
推荐指数
3
解决办法
188
查看次数

记录中嵌套 Spring 配置(ConfigurationProperties)

如何将application.yaml具有嵌套属性的配置映射到 Java 中的类似记录结构?

例如,如果我们有以下 yaml:

foo:
    bar:
        something: 42

    baz:
        otherThing: true

    color: blue
Run Code Online (Sandbox Code Playgroud)

所需的记录结构将类似于:

@ConfigurationProperties(prefix = "foo")
@ConstructorBinding
public record Foo(
    Bar bar,
    Baz baz,
    String color
) {}

// ---

@ConfigurationProperties(prefix = "foo.bar")
@ConstructorBinding
public record Bar(
    int something
) {}

// ---

@ConfigurationProperties(prefix = "foo.baz")
@ConstructorBinding
public record Baz(
    boolean otherThing
) {}
Run Code Online (Sandbox Code Playgroud)

java spring spring-boot java-record java-17

9
推荐指数
2
解决办法
7337
查看次数

在 Android Studio 中使用 JDK17 和记录(Java、Android)

在此输入图像描述

第1部分 :-

获得此版本的 Android Studio 后,我可以在我的项目中使用JDK17 。一切都工作得很好,没有构建失败,没有运行时错误等(就像增强型开关工作正常)......但是这个警告在每次构建期间不断出现。有什么办法可以抑制这种情况吗?

在此输入图像描述 (警告文本 -> “一个或多个类的文件版本 >= 56,不受官方支持”

这些是 build.gradle 文件:

(1):-

buildscript {

   repositories {
       google()
       mavenCentral()
   }
   dependencies {
       classpath 'com.android.tools.build:gradle:7.1.0-rc01'
       classpath 'com.google.android.gms:strict-version-matcher-plugin:1.2.2'

       // NOTE: Do not place your application dependencies here; they belong
       // in the individual module build.gradle files
   }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
Run Code Online (Sandbox Code Playgroud)

(2):-

apply plugin: 'com.android.application'
apply plugin: 'com.google.android.gms.strict-version-matcher-plugin'

android {
    compileSdkVersion 32 …
Run Code Online (Sandbox Code Playgroud)

java android android-studio java-record java-17

9
推荐指数
2
解决办法
6075
查看次数

字节码将记录类转换为可变的

我刚刚看到 EBean 以一种让我感觉奇怪的方式对记录类文件进行字节码转换,我寻求从 JVM 角度来看这是否合法的答案。

显然,可以有一个类文件,其中类扩展java.lang.Record并定义记录组件属性(因此它是一个“记录”,就像 javac 会创建它一样),但具有 javac 不允许的以下附加“功能”:

  • 使记录组件的字段成为非最终字段
  • 添加未通过规范构造函数设置、也未通过记录组件属性公开的其他字段

对我来说,这似乎是非法的,我预计会出现 JVM 验证错误。我想知道这是否是“受支持”的东西,我可以在此基础上进行构建,或者缺乏验证是否是 JVM 错误。难道记录只是Java语言的一个特性,没有JVM的支持吗?!我读到记录的最终字段是“真正的最终”,即使通过反射也无法更改,并且假设必须有特殊的 JVM 支持来确保记录与 Java 语言语义相匹配......

java jvm bytecode jvm-bytecode java-record

9
推荐指数
2
解决办法
1028
查看次数

IntelliJ 不提供将类转换为记录的选项

我有一大组 POJO 类(100 多个),我想将它们转换为 Java 记录。我想自动化这个过程。

我使用的是 Java 18 (Amazon Coretto JDK) 和 IntelliJ 2022.1.4(终极版):Build #IU-221.6008.13, built on July 18, 2022

coretto-18被配置为模块的默认VM。

我遵循了 IntelliJ 文档(https://www.jetbrains.com/idea/guide/tips/convert-to-record/),但上下文操作不会显示选项“转换为记录”(预期) 。

在此输入图像描述

intellij-idea java-record

9
推荐指数
1
解决办法
3799
查看次数

令牌“记录”上的 Java 14 语法错误,预期记录

我正在用 Java 14 构建一些东西。

我写了一个名为 PersonInJava14 的类,如下所示。

package recordexample;

public record PersonInJava14(String name, String gender, int age) {}
Run Code Online (Sandbox Code Playgroud)

但是,它会引发这样的错误。

Syntax error on token "record", record expected
Run Code Online (Sandbox Code Playgroud)

该项目基于 Java 14,可以进行必要的设置以在 Java 14 中运行它。

这是我的设置部分。

在此处输入图片说明

我该如何解决?

java eclipse java-14 java-record

8
推荐指数
0
解决办法
5695
查看次数

具有可为空组件的 Java 记录

我真的很喜欢在 Java 14 中添加记录,至少作为预览功能,因为它有助于减少我将 lombok 用于简单、不可变的“数据持有者”的需要。但是我在实现可空组件时遇到了问题。我试图避免null在我的代码库中返回以表明某个值可能不存在。因此,我目前经常在 lombok 中使用类似以下模式的内容。

@Value
public class MyClass {
 String id;
 @Nullable String value;

 Optional<String> getValue() { // overwrite the generated getter
  return Optional.ofNullable(this.value);
 }
}
Run Code Online (Sandbox Code Playgroud)

当我现在对记录尝试相同的模式时,不允许声明incorrect component accessor return type.

record MyRecord (String id, @Nullable String value){
 Optional<String> value(){
  return Optional.ofNullable(this.value); 
 }
}
Run Code Online (Sandbox Code Playgroud)

因为我认为Optional现在首选使用s 作为返回类型,所以我真的很想知道为什么会有这个限制。我对用法的理解有误吗?如何在不添加另一个带有不隐藏默认签名的签名的访问器的情况下实现相同的目标?如果Optional不是在这种情况下,在所有被使用?

java optional preview-feature java-14 java-record

8
推荐指数
2
解决办法
1070
查看次数

Java 记录堆栈的分配方式与 C# 结构类似吗?

Java 记录与 C# 结构类似吗?我的意思是,如果它们是堆栈分配的,而不是使用像类这样的引用,那么它们是在堆上分配的。

java heap-memory stack-memory java-record

8
推荐指数
1
解决办法
1686
查看次数

Java 记录和 Lombok 注释 - IntelliJ

只是尝试动手操作java.lang.Record。我已经阅读了文档和JEP-359以获得一些理解。因此,在阅读构造函数的隐式声明时,我想到将其与现有的代码生成库 - Lombok 混合!

现在我最终创建的一个最小的可重复示例是这个记录

import lombok.AllArgsConstructor;

@AllArgsConstructor
public record Java(String version) {
}
Run Code Online (Sandbox Code Playgroud)

使用 IntelliJ 编译时成功生成类文件,如下所示

public final class Java extends java.lang.Record {
    private final java.lang.String version;
    public Java(java.lang.String version) { /* compiled code */ }
    ... rest of the compiled code
} 
Run Code Online (Sandbox Code Playgroud)

请注意,.class文件的构造函数也正是我在这两个世界中独立所期望的。但是,在 IntelliJ 编译期间进一步尝试创建此记录的实例失败:

public class MixOfWorlds {

    public static void main(String[] args) {
        System.out.println(new Java("14").version()); // cannot resolve constructor
    }
}
Run Code Online (Sandbox Code Playgroud)

我将创建一个更简单的示例来javac使用java工具执行编译和执行。如果这是由于我可能忽略的某些事情而可能发生的预期行为,我仍在寻找答案?

IntelliJ IDEA 2020.1 EAP …
Run Code Online (Sandbox Code Playgroud)

java intellij-idea intellij-lombok-plugin java-14 java-record

7
推荐指数
1
解决办法
625
查看次数