在一个项目中,如果我们标记了某些元素为 Deprecated 的话,如何让我们能够快速找到? 简单来说,你可以对项目进行 Code Inspection。 选择 Analyze > Inspect Code 在弹出的对话框中,对整个项目进行代码分析。 在分析的结果中,你就可以看到那些类,或者方法,或者字段被 Deprecated 了。 https://www.cwiki.us/questions/57934341
在一个项目中,如果我们标记了某些元素为 Deprecated 的话,如何让我们能够快速找到? 简单来说,你可以对项目进行 Code Inspection。 选择 Analyze > Inspect Code 在弹出的对话框中,对整个项目进行代码分析。 在分析的结果中,你就可以看到那些类,或者方法,或者字段被 Deprecated 了。 https://www.cwiki.us/questions/57934341
在本部分的快速指南中,我们将会查看 Java 的 deprecated API 和如何在程序中使用 @Deprecated 注解。 @Deprecated Annotation(注解) 作为程序的进化和迭代,随着时间的推移,在项目中总会有些类,构造方法,字段,类型或者方法不建议人们继续继续使用。 为了避免程序向后兼容的问题,而导致程序或者 API 不能使用,我们将会对不再使用的元素使用 @Deprecate 注解来声明。 @Deprecated 主要目的是告诉其他的开发者标记的元素不要在程序中继续使用了。 同时我们还建议在 @Deprecated 注解后面添加一些说明的文本来解释如果希望程序或者 API 具有相同的功能应该使用何种其他的方法。 SRC https://github.com/cwiki-us-demo/java-tutorials/blob/master/core-java-modules/core-java-annotations/src/main/java/com/ossez/annotations/ClassWithDeprecatedMethod.java package com.ossez.annotations; public class ClassWithDeprecatedMethod { /** * Calculate period between versions * * @deprecated * * This method is no longer acceptable to compute time between versions. * * <p> Use {@link ClassWithDeprecatedMethod#updatedMethod()} instead. */ @Deprecated public static void deprecatedMethod() { } /** * Updated Method instead of deprecatedMethod. */ public static void updatedMethod() { } } 请注意,如果一个 Java 的元素被声明了,但是又在程序或者项目的其他地方被引用的话,编译器将会显示丢弃(deprecated)API 的警告。 在上面的示例代码中,如果 deprecatedMethod 被调用了,只有调用 deprecatedMethod 这个方法显示丢弃的警告。 同时请注意,通过使用 Javadoc @deprecate 标记,我们将会在 Java 文档中也被标记丢弃。 上面的代码,如果在 IDE 中查看文本,将会显示为如下: Java 9 添加的可选属性 针对 Java 9 的 @Deprecated 注解,还添加了 since 和 forRemoval 属性。 since - 接受字符串的输入参数,用于定义我们丢弃的内容从哪个版本开始。默认为空字符串。 forRemoval - 使用布尔(boolean)类型,用于标记我们丢弃的内容是不是从下一个发行的版本就会被删除。默认为 false。 如下面的代码中对上面属性的定义。需要注意的是,这个功能最低的版本为 Java 9,如果你还在使用 Java 8 的话,是不能被支持的,将会出现编译错误。 /** * Calculate period between versions * * @deprecated * * This method is no longer acceptable to compute time between versions. * * <p> Use {@link ClassWithDeprecatedMethod#updatedMethod()} instead. */ @Deprecated(since = "4.5", forRemoval = true) public static void deprecatedMethod() { } 上面的内容表示的是 deprecatedMethod 方法是从版本 4.5 开始准备丢弃的,同时已经计划在下一个主要的发行版本中完全丢弃删除。 通过添加上面的内容,如果我们现在还在尝试使用这个方法的话,将会通知编译器给我们一个非常强烈的警告。 同时,当前的主流 IDE 工具也能够明显的显示上面强提示。例如在 IntelliJ 中,删除线将会使用一个红色的删除线来替代当前使用的黑色删除线。 结论 在这个快速文章中,我们看到了如何使用 @Deprecated 声明来标记不再使用的元素,以及针对 Java 9 我们可以为其设置一些其他的属性以及这些属性的默认值。 完整的代码,请参考 GitHub 中的项目,可能项目中的源代码和文章中使用的代码有所不同,请以 GitHub 中的代码为主。 代码和内容的完整链接为:https://www.cwiki.us/display/JAVAZH/Java+@Deprecated+Annotation
错误提示信息为: Error:java: java.lang.ExceptionInInitializerError com.sun.tools.javac.code.TypeTags 如果使用 Maven 错误信息是一样的。 [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.449 s [INFO] Finished at: 2020-02-26T08:34:45-05:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project core-java-annotations: Fatal error compiling: java.lang.ExceptionInInitializerError: com.sun.tools.javac.code.TypeTags -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException 请问这是什么原因呢? 这个可能原因是你编译器的环境使用过高。但是你的依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.6.12</version> <scope>provided</scope> </dependency> 过低导致的。 可以解决的办法是将你的编译 JDK 降到 1.8。 或者将 org.projectlombok 升级到最新的版本。 例如我们在 IntelliJ 中,使用 1.8 编译代码,就没有错误。 https://www.cwiki.us/display/JAVAZH/questions/57934274/answers/57934279
在当前使用的 IntelliJ 中的 JDK 版本为 1.8,如何修改 IntelliJ 使用的 JDK 版本为 1.11 呢? 你可以在 IntelliJ 中进行修改。 选择 File 后,然后选择 Project Structure 然后需要在你的项目结构中首先安装不同的 JDK 版本。 选择项目(Project)后选择不同的 JDK 和不同的编译级别。 然后刷新你的项目在进行编译的时候,你会发现你的 IntelliJ 已经使用设置的新 JDK 版本进行编译项目了。 请参考链接有关具体的问答内容:IntelliJ 更改项目使用的 JDK 版本
Java BigDecimal 如何去掉末尾多余的 0 呢? BigDecimal 原生提供了stripTrailingZeros() 方法可以实现去掉末尾的 0。 如果你在这里直接使用 然后使用 toString() 将会转换为科学计数法输出。 考察下面的代码: 你可以访问 https://github.com/cwiki-us-demo/java-tutorials/blob/master/java-numbers/src/test/java/com/ossez/maths/BigDecimalDemoUnitTest.java 访问源代码。 /** * To StripTrailingZeros */ @Test public void bigDecimalStripTrailingZerosTest() { BigDecimal bigNumber = new BigDecimal("2707000000000"); // apply StripTrailingZeros function logger.info("{}", bigNumber.toString()); logger.info("{}", bigNumber.stripTrailingZeros().toString()); logger.info("{}", bigNumber.stripTrailingZeros().toPlainString()); } 上面的代码将会输出下面的内容: 2020/02/25 14:00:19.271 [main] INFO c.ossez.maths.BigDecimalDemoUnitTest - 2707000000000 2020/02/25 14:00:19.275 [main] INFO c.ossez.maths.BigDecimalDemoUnitTest - 2.707E+12 2020/02/25 14:00:19.275 [main] INFO c.ossez.maths.BigDecimalDemoUnitTest - 2707000000000 stripTrailingZeros(),将会转换为科学计数法输出,如果你不希望用科学计数法输出的话,那么你可以使用 toPlainString() 进行全字符输出。
BigDecimal 的 toString() 方法将会把 BigDecimal 通过字符串的方式输出。这个方法将会在必要的时候使用指数进行输出。 具体的转换步骤是按照下面的步骤进行转换的: BigDecimal的非标度值的绝对值用字符'0'到'9',没有被转换为一个字符串基地10零(除非它的值是零,在这种情况下,一个单一的'0'字符被使用)。 接下来,计算调整的指数;这是无效的标度,加上字符的转换的标度值,减1的次数。也就是说,-scale+(ulength-1),其中ulength是十进制数字(其精度)的非标度值的绝对值的长度。 如果该比例大于或等于零,并且调整的指数大于或等于-6,该号码将被转换为字符的形式,而无需使用指数表示法。 在这种情况下,如果该比例是零,则没有小数点被添加和如果规模正小数点将被插入的规模指定的字符数的小数点的右边。 '0'字符添加到转换的非标度值的左侧是必要的。如果前面没有字符,小数点这个插入之后再传统的'0'字符作为前缀。 否则(即,如果该比例是负的,或经调整的指数小于-6),该号码将被采用指数表示法转换为字符形式。在这种情况下,如果转换后的BigInteger有一个以上的位小数点第一位数字后插入。 在字符形式的指数,然后后缀转换非标度值(也许插入小数点);这包含字母“E”后面立刻被调整的指数转换为字符形式。 后者的基数为十,使用字符'0'到'9',没有前导零,并且总是由前缀符号字符' - '(' u002D'),如果调整后的指数为负数,否则为'+'(' u002B')。 ' - '最后,整个字符串由一个减号字符的前缀(' u002D')如果非标度值小于零。如果非标度值为零或正数无符号字符作为前缀。 不使用科学计数法将 BigDecimal 转换为 String SRC 请参考 GitHub 上的源码代码中 bigDecimalWithoutScientificNotationTest():方法 https://github.com/cwiki-us-demo/java-tutorials/blob/master/java-numbers/src/test/java/com/ossez/maths/BigDecimalDemoUnitTest.java /** * To String without ScientificNotation */ @Test public void bigDecimalWithoutScientificNotationTest() { String input = RandomStringUtils.randomNumeric(12) + "12345678901234567" + "8901234567890123" + "4567890123456789" + "0123456789012345" + "6789012345678901" + "2345678901234567" + "8901234567890123" + "4567890123456789" + "0123456789012345" + "6789012345678901" + "2345678901234567" + "8901234567890123" + "4567890123456789" + "0123456789012345" + "6789012345678901" + "2345678901234567" + "8901234567890123" + "4554324324362432" + "7674637264783264" + "7832678463726478" + "3264736274673864" + "7364732463546354" + "6354632564532645" + "6325463546536453" + "6546325463546534" + "6325465345326456" + "4635463263453264"; // Converting to BigDecimal BigDecimal bigNumber = new BigDecimal(input); // Apply toString() method String numberStr = bigNumber.toString(); // Print the result logger.info("{}", numberStr); } OUTPUT 程序最后的输出如下,将会输出转换后的字符串。 2020/02/25 09:43:29.595 [main] INFO c.ossez.maths.BigDecimalDemoUnitTest - 1503277200971234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234554324324362432767463726478326478326784637264783264736274673864736473246354635463546325645326456325463546536453654632546354653463254653453264564635463263453264 使用科学计数法将 BigDecimal 转换为 String SRC 请参考 GitHub 上的源码代码中 bigDecimalScientificNotation():方法 https://github.com/cwiki-us-demo/java-tutorials/blob/master/java-numbers/src/test/java/com/ossez/maths/BigDecimalDemoUnitTest.java /** * To String with ScientificNotation */ @Test public void bigDecimalScientificNotation() { // Create a BigDecimal object BigDecimal bigNumber; // Create a String object String numberStr; // Set precision to 5 MathContext mc = new MathContext(6); bigNumber = new BigDecimal(RandomStringUtils.randomNumeric(10)+"E5", mc); // apply toString() method logger.info("{}", bigNumber.toString()); logger.info("{}", bigNumber.toEngineeringString()); logger.info("{}", bigNumber.toPlainString()); } OUTPUT 程序最后的输出如下,将会输出转换后的字符串。 2020/02/25 10:00:50.909 [main] INFO c.ossez.maths.BigDecimalDemoUnitTest - 8.31198E+14 2020/02/25 10:00:50.912 [main] INFO c.ossez.maths.BigDecimalDemoUnitTest - 831.198E+12 2020/02/25 10:00:50.912 [main] INFO c.ossez.maths.BigDecimalDemoUnitTest - 831198000000000 BigDecimal类有3个 toString 方法,分别是 toString()、 toEngineeringString() 、toPlainString(). 从 BigDecimal 的注释中可以看到这3个方法的区别: toString() - 在必要的时候使用科学计数法 toEngineeringString() 在必要的时候使用工程计数法。类似于科学计数法,只不过指数的幂都是3的倍数,这样方便工程上的应用,因为在很多单位转换的时候都是10^3 toPlainString() - 不使用任何科学计数法。 不使用指数 科学计数法 工程计数法 2700 2.7 × 10³ 2.7 × 10³ 27000 2.7 × 10⁴ 27 × 10³ 270000 2.7 ×…
在很多情况下,我们都会使用 SLF4J 来定义日志。 那么如何定义一个 Logger 呢? 相信绝大部分人都会定义为: private static final Logger logger = LoggerFactory.getLogger(BigDecimalDemoUnitTest.class); 但是我们为什么要使用 private static final 来进行修饰呢? private - 没有其他类可以劫持你的日志 static - 因为使用了静态,所以每一个类就只有一个日志,同时可以避免尝试序列化日志 final - 在类的生命周期中,不需要修改日志 同时,你可以定义变量 log 来替代 logger,这样能够减少输入的字符数。当然这个也需要根据你的项目要求来定了。 当然还有下面的一种情况,考察日志代码: protected final Logger log = LoggerFactory.getLogger(getClass()); 上面有关日志的定义与我们的规则是完全相反的。 上面的代码允许你在所有具有继承关系的类中使用相同的日志名(与实际的类名相同)。 例如: 如果类 Bar Extends Foo,那么上面 2 个类的日志将会 log 到 Bar logger 中。
intellij 提示 java-numbers.iml does not exist Please correct the file content。 如何解决这个问题? 最简单的办法就是删除 .idea 和 target 文件后,重新导入就可以了。 https://www.cwiki.us/questions/57934173/answers/57934176?flashId=-1458442626
在 UI 界面中,选择 Settings > General。 在弹出的界面中,选择 Visibility, project features, permissions 后面的 Expand 按钮。 然后在弹出的界面中,将 Project Visibility 下面从 Private 选择为 Public。 你的项目就可以被 Public 访问到了。 最后,不要忘记将你的修改保存以便于生效。 https://www.cwiki.us/display/RevisionControl/questions/57934160/gitlab-%e5%a6%82%e4%bd%95%e4%bf%ae%e6%94%b9%e9%a1%b9%e7%9b%ae%e4%bb%8e%e7%a7%81%e6%9c%89%e5%88%b0%e5%85%ac%e6%9c%89
如我们在 域语言(Domain Language)章节中讨论的内容一致,一个 步骤(Step)是一个独立封装了执行顺序的批量作业(Job),并且包含有用于定义和控制一个批量作业的所有独立信息。 针对这个 Step 的定义必然是非常模糊的,因为任何一个给定步骤的内容都会被要求开发人员在编写一个作业(job)的时候被描述。 一个步骤(Step)可以根据开发人员的需求被开发为简单或者复杂。 一个简单的步骤可能就仅仅是从文件中载入数据然后写入到数据库中,可能并不需要太多的代码或者甚至都不需要代码(这个取决你需要的实现)。一个步骤(Step)也可能会比较复杂,这是因为你将要在数据处理的过程中实现一些复杂的业务规则,如下图所示: 图片 1. 步骤(Step) https://www.cwiki.us/display/SpringBatchZH/Configuring+a+Step