标签: java-13

Java 13 三引号文本块 *WITHOUT* 换行符

带有"""分隔符的 Java 13 多行文本块工具正变得众所周知。

但是,我经常需要整段没有嵌入换行符的段落。

换句话说,以下代码片段:

String paragraph =
    """
    aaaa bbbb cccc
    dddd eeee ffff
    gggg hhhh iiii
    """
System.out.println(paragraph);
Run Code Online (Sandbox Code Playgroud)

如您所料,产生以下内容:

aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii
Run Code Online (Sandbox Code Playgroud)

...这通常非常有用。但是,就我而言,对于特别大的段落,我需要它来生成:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii
Run Code Online (Sandbox Code Playgroud)

(....稍后处理文本流。)

有没有办法为三重引号功能建立“无换行符”参数?

java string preview-feature java-13

16
推荐指数
2
解决办法
1145
查看次数

OpenJDK 64 位服务器 VM 警告:选项 -Xverify:none 和 -noverify 在 JDK 13 中已弃用,可能会在未来版本中删除

我正在使用 Java 14 启动一个新的 Spring 5 项目。它已编译,但给了我一个警告:

OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release
Run Code Online (Sandbox Code Playgroud)

任何想法如何解决它?

java spring java-13

10
推荐指数
2
解决办法
4119
查看次数

Java 13中新的关键字“ yield”是什么意思?

Java 13引入了yield用于switch表达式的关键字。

我该如何使用它?它与默认值returnbreak值有什么区别?

java yield switch-statement java-13

8
推荐指数
3
解决办法
634
查看次数

是否有任何与 Java 13 兼容的 SonarQube 版本

我目前正在使用 Maven 在 Java 8 JDK 上使用 SonarQube Community Edition 7.7 版,我想开始评估 OpenJDK 13 。Sonarqube 不支持 OpenJDK 13

maven spring-boot sonarqube java-13

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

在JRE中以编程方式检测--preview模式

从Java 11开始,可以启用Java编译器和运行时上的PREVIEW-MODE。它允许预览新功能。(JEP 12

java --enable-preview
Run Code Online (Sandbox Code Playgroud)

如何在Java中检测是否已在启用预览模式的情况下启动JVM?

目的是在应用程序内状态页面/ json上描述正在运行的容器-用于devops概述。

到目前为止,我研究了系统属性和标志,它们均未包含任何提示。

java jvm-arguments java-13

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

如何使用 java 13 设置 spring-boot 应用程序

我正在创建一个 spring-boot 应用程序,它在 openJdk12 上运行并表现良好。应用:https : //github.com/jactor-rises/jactor-persistence

我正在寻找如何使用 openJdk13 进行设置。

我尝试使用 spring-boot2.1.8.RELEASE2.1.9.RELEASE,但两个版本都在运行时失败,并显示IllegalStateException

java.lang.IllegalStateException: Failed to load ApplicationContext

    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)
    at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190)
    at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246)
    at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:97)
    at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$invokeTestInstancePostProcessors$5(ClassTestDescriptor.java:349)
    at org.junit.jupiter.engine.descriptor.JupiterTestDescriptor.executeAndMaskThrowable(JupiterTestDescriptor.java:215)
    at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$invokeTestInstancePostProcessors$6(ClassTestDescriptor.java:349)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
    at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1621)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:312)
    at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)
    at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734)
    at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)
    at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.invokeTestInstancePostProcessors(ClassTestDescriptor.java:348)
    at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.instantiateAndPostProcessTestInstance(ClassTestDescriptor.java:270)
    at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$testInstanceProvider$2(ClassTestDescriptor.java:259)
    at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$testInstanceProvider$3(ClassTestDescriptor.java:263)
    at java.base/java.util.Optional.orElseGet(Optional.java:362)
    at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$testInstanceProvider$4(ClassTestDescriptor.java:262)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:82)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:59)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$0(NodeTestTask.java:83)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72) …
Run Code Online (Sandbox Code Playgroud)

java spring-boot java-13

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

返回封闭开关表达式之外

我在Java 12中使用开关表达式¹将字符串转换为HTTP方法

static Optional<RequestMethod> parseRequestMethod(String methodStr) {
    return Optional.ofNullable(
          switch (methodStr.strip().toUpperCase(Locale.ROOT)) {
              case "GET" -> RequestMethod.GET;
              case "PUT" -> RequestMethod.PUT;
              case "POST" -> RequestMethod.POST;
              case "HEAD" -> RequestMethod.HEAD;

              default -> {
                  log.warn("Unsupported request method: '{}'", methodStr);
                  return null;
              }
          });
}
Run Code Online (Sandbox Code Playgroud)

我想警告默认分支中不支持的方法,并返回null(然后包装在Optional中)。

但是上面的代码会导致编译器错误:

返回封闭开关表达式之外

我该如何进行编译?


为了完整起见,这是RequestMethod枚举的定义:

enum RequestMethod {GET, PUT, POST, HEAD}
Run Code Online (Sandbox Code Playgroud)

¹ 开关表达式是Java 12中的预览功能。

java switch-statement java-12 java-13

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

Java 13 SE 规范不需要缓存盒装 Byte 对象吗?

阅读 JAVA 13 SE 规范,我在第 5 章第 5.1.7 节中找到。拳击转换以下保证:

如果被装箱的值 p 是对 boolean、char、short、int 或 long 类型的常量表达式(第 15.28 节)求值的结果,并且结果为 true、false,则为 '\u0000' 到 ' 范围内的字符\u007f'(含),或 -128 到 127(含)范围内的整数,然后让 a 和 b 是 p 的任意两次装箱转换的结果。a == b 总是这样

我觉得奇怪的是,字节类型的值被排除在该措辞之外。

例如,在如下代码中:

Byte b1=(byte)4;
Byte b2=(byte)4;
System.out.println(b1==b2);
Run Code Online (Sandbox Code Playgroud)

我们有一个byte类型的常量表达式,装箱后b1和b2的值可能是也可能不是同一个对象。

在没有演员的情况下,它实际上以相同的方式工作:

Byte b1=4;
Run Code Online (Sandbox Code Playgroud)

在这里,我们在赋值上下文中有一个 int 类型的常量表达式。所以,根据规范

如果变量的类型为 Byte、Short 或 Character,并且常量表达式的值可分别以 byte、short 或 char 类型表示,则可以使用缩窄原语转换后跟装箱转换。

因此表达式将被转换为字节,并且该字节类型的值将被装箱,因此不能保证该值是实习的。

我的问题是我对规范的解释是否正确,还是我遗漏了什么?我查看了规范是否需要使用 Byte.valueOf() 方法进行装箱(为此可以保证),但事实并非如此。

java boxing specifications java-13

6
推荐指数
2
解决办法
185
查看次数

JDK 11 与 JDK 13 的性能

更新

在整个评论中,结果证明我采用的基准测试方法是不正确的,因此结果具有误导性。在纠正我的方法后(如接受的答案),结果正如人们所期望的 - JDK 13 的性能与 JDK 11 一样好。有关更多详细信息,请参阅答案。

原始问题

我在 Windows 10 下对 HashSet 进行了一些性能基准测试,使用以下 JMH 测试代码:

@Benchmark
@BenchmarkMode(Mode.AverageTime)
@Fork(value = 1, warmups = 1)
public void init() {
    HashSet<String> s = new HashSet<>();
    for (int i = 0; i < 1000000; i++) {
        s.add(Math.random() + "");
    }
    s.size();
}
Run Code Online (Sandbox Code Playgroud)

我在不同的 JDK 版本下编译并运行它,这是我得到的结果:

在此处输入图片说明

我也用不同的堆大小对其进行了测试(因此每个 JDK 有 3 种不同的颜色)。JDK 14 当然是今天的预发布快照——只是为了看看 ZGC 在 Windows 下的表现。

我想知道 - JDK 11 之后发生了什么?(注意,对于 JDK 12,它已经开始增长,即使它没有出现在上面的图表中)

java garbage-collection jvm java-11 java-13

6
推荐指数
1
解决办法
3011
查看次数

maven Surefire 插件不使用 --enable-preview 模式

这是我的 pom.xml:

...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>13</source>
                <target>13</target>
                <release>13</release>
                <compilerArgs>
                    --enable-preview
                </compilerArgs>
            </configuration>
        </plugin>
...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
            <configuration>
                <reuseForks>false</reuseForks>
                <argLine>--enable-preview</argLine>
            </configuration>
        </plugin>
Run Code Online (Sandbox Code Playgroud)

问题是构建正常,但是当启动测试时我得到:

[错误] 无法在项目 foo-project 上执行目标 org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M4:test (default-test):执行目标 org.apache.maven 的默认测试.plugins:maven-surefire-plugin:3.0.0-M4:测试失败:java.lang.UnsupportedClassVersionError:未为其/project/MyTest启用预览功能(类文件版本57.65535)。尝试使用 '--enable-preview' 运行 -> [帮助 1]

我必须在 pom.xml 中插入什么才能在启用预览模式的情况下执行测试?

谢谢。

java maven maven-surefire-plugin java-13

6
推荐指数
1
解决办法
1670
查看次数