毕尔巴鄂对阵皇家社会:两支近邻球队将于西甲联赛 “巴斯克德比”中为捍卫荣耀而战贝壳第三季度营收226亿元 经调净利润17.8 亿元 同比下降17.46%AI营销,让科技巨头尝到了大模型商业化的甜头安恒信息范渊在乌镇峰会谈AI:以工具视之、以工具用之、以工具治理之诺基亚与微软再合作,为 Azure 数据中心供货延长五年天岳先进发布业界首款 300mm(12 英寸)N 型碳化硅衬底三星介绍内部安全团队 Project Infinity 攻防演练项目,高效修复 Galaxy 手机平板漏洞上海市将推进低空飞行服务管理能力建设,2027 年底前累计划设相应航线不少于 400 条岁末,海尔给您备好一套“小红花”为什么说Q10K Pro是今年最值得入手的电视?看完这几点就明白了!“小墨方·大不凡”!Brother“小墨方”系列彩喷一体机全新上市黄仁勋:AI智能需求强劲,“物理定律”限制英伟达芯片增长诺基亚与微软再合作,为Azure数据中心供货延长五年国家数据局:到2029年基本建成国家数据基础设施主体结构中国已发展成为全球最大的互联网市场,拥有全球最多的网民和移动互联网用户中国铁塔:计划按照10:1的比例合股美国FCC正式划定5.9GHz频段用于C-V2X技术在AI领域奋起直追!苹果要对Siri大革新 2026年正式发布日本机构公布量子专利榜单:本源量子、国盾量子位居全球第1中国联通:拟向华为、中兴展开5G网络设备竞争性谈判采购
  • 首页 > 数据存储频道 > 数据库频道 > 编程开发

    从 Java 11 迁移到 Java 17 值得吗?

    2023年08月09日 17:07:43   来源:作者丨Sergei Dzeboev

      作者丨Sergei Dzeboev

      编译丨诺亚

      Java17给Java带来了一些变化,但也使许多开发人员重新考虑他们迁移到其他JVM语言的愿望。最明显的变化是在使Java代码现代化和添加新的语言结构以简化它的方向上进行的。当然,这个问题并非没有对Java核心的改变,这使得Java更加高效。

      1、文本块

      文本块功能终于出现在Java中。我确信这是Java程序员等待已久的变化之一。现在你可以忘记难以阅读的长复合行。文本块允许你以最方便的方式编写多行文本。在这样的块中,你可以按照自己希望的方式撰写文本,并且仍然可以使用转义序列进行更精确的格式设置。

      Java11. 字符串转义序列:

      复制

      public String poem = " " +

      "Twinkle, Twinkle, Little Star" +

      " " +

      " Twinkle, twinkle, little star," +

      " How I wonder what you are!" +

      " Up above the world so high," +

      " Like a diamond in the sky." +

      " " +

      " Twinkle, twinkle, little star," +

      " How I wonder what you are!";

      Java17.文本块:

      复制

      public String poem = """

      Twinkle, Twinkle, Little Star

      Twinkle, twinkle, little star,

      How I wonder what you are!

      Up above the world so high,

      Like a diamond in the sky.

      Twinkle, twinkle, little star,

      How I wonder what you are!

      """;

      2、Record

      另一个慢慢使Java语言更有用的更新是record。以前,要创建一个类,我们需要描述该类,指定其字段,并添加必要的方法,例如equals、hashcode、getter和setters。自从record出现以来,所有这些现在都变得不必要了。

      record允许你通过仅指定必填字段来创建数据安全类;将自动创建所有其他方法。但是,值得记住的是,record充当数据类,创建是为了存储数据,而不是执行各种操作。record是线程安全的,因为所有record字段都是最终的。最后要知道的重要一点是,用于获取字段值的生成方法不会像经典Java Bean 中那样包含“get”。

      Java11.数据类:

      复制

      public class DataClass {

      public DataClass (Integer id, String name) {

      this.id = id;

      this.name = name;

      }

      private final Integer id;

      private final String name;

      public Integer getId() {

      return id;

      }

      public String getName() {

      return name;

      }

      @Override

      public boolean equals(Object o) {

      }

      @Override

      public int hashCode() {

      }

      }

      Java17.Record:

      复制

      public record DataClass(Integer id, String name) {

      }

      区别很明显:在执行相同功能的同时,创建Record所需的代码行要少得多。

      3、新的switch表达式

      更改列表还包括切换表达式。这些更改不仅影响了Switch表达式的语法(使其编写更加简洁),还影响了功能。Switch表达式现在返回迭代的结果,使编写代码变得更加容易,并使其更加简洁。新的开关表达式不再需要每个case后面都加一个break

      Java11.switch表达式:

      复制

      public String getSeasonDescription(Season season) {

      String seasonDescription;

      switch (season) {

      case SPRING:

      seasonDescription = "Flowers are blooming!";

      break;

      case SUMMER:

      seasonDescription = "It's hot outside!";

      break;

      case AUTUMN:

      seasonDescription = "Leaves are falling!";

      break;

      case WINTER:

      seasonDescription = "Snow is coming!";

      break;

      default:

      throw new IllegalStateException("Invalid season: " + season);

      }

      return seasonDescription;

      }

      Java 17. 增强的 Switch 表达式:

      复制

      public String getSeasonDescription(Season season) {

      return switch (season) {

      case SPRING -> "Flowers are blooming!";

      case SUMMER -> "It's hot outside!";

      case AUTUMN -> "Leaves are falling!";

      case WINTER -> "Snow is coming!";

      };

      }

      4、instanceof模式匹配

      另一项设计改进也影响了操作员。现在,更安全,更简洁。通过此更改,不再需要首先检查给定对象是否是某个类的实例,然后执行强制转换;现在可以在一行中完成此操作。如前所述,这不仅仅是语法糖,而是一个更优化的运算符。

      Java 11. 经典的 intanceof

      复制

      public void findInstance(Object o) {

      if (o instanceof String) {

      String s = (String) o;

      System.out.printf("Object is a string %s", s);

      } else if (o instanceof Number) {

      Number n = (Number) o;

      System.out.printf("Object is a number %n", n);

      }

      }

      Java 17. 更新的 intanceof

      复制

      public void findInstance(Object o) {

      if (o instanceof String s) {

      System.out.printf("Object is a string %s", s);

      } else if (o instanceof Number n) {

      System.out.printf("Object is a number %n", n);

      }

      }

      5、Sealed Classes密封类

      Java 17也考虑了安全性,并朝着这个方向迈出了重要的一步。这个想法是限制类或接口的继承,同时保持其公开。结果,新的类类型,密封类,被添加到Java中。密封类的语法允许你指定可以使用其功能的后代。反过来,继承者还可以允许或拒绝继承,或者指定可以沿链继承的类。此功能使你可以更灵活地创建项目,并方便地调整代码的API。

      Java 17. 密封类:

      复制

      public sealed class SealedClass permits AnotherSealedClass, AnotherNonSealedClass, AnotherFinalClass {

      }

      Java 17. 非密封继承人:

      复制

      public non-sealed class AnotherNonSealedClass extends SealedClass {

      }

      Java17.最终继承人:

      复制

      public final class AnotherFinalClass extends SealedClass {

      }

      Java17.密封继承人:

      复制

      public sealed class AnotherSealedClass extends SealedClass permits AnotherNonSealedClassTwo {

      }

      Javai17.非密封继承人二级:

      复制

      public non-sealed class AnotherNonSealedClassTwo extends AnotherSealedClass {

      }

      6、NullPointerExceptions

      最后,Java 17 中一个非常有用的更新是改进的NullPointerException!最后,在堆栈跟踪日志中,你可以看到哪个特定字段导致了NullPointerException。仅此功能就应该鼓励你切换到Java 17。你不再需要长时间在代码中四处寻找发生异常的险恶地方;现在Java将为你完成所有工作。

      Java11.NPE:

      复制

      public static void main(String... args) {

      String s = null;

      System.out.println(s.toLowerCase());

      }

      复制

      Exception in thread "main" java.lang.NullPointerException

      at Main.main(Main.java:4)

      Java17.改进的NPE:

      复制

      public static void main(String... args){

      String s = null;

      System.out.println(s.toLowerCase());

      }

      复制

      Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.toLowerCase()" because "s" is null

      at edu.javamodules/edu.javaversions.eleventoseventeen.NpeExample.main(NpeExample.java:7)

      7、其他创新

      当然,这并不是Java17中所做的更改的全部列表,但是讨论的创新是最引人注目的。与往常一样,Java开发人员在改进JVM方面做得非常出色,使其更加高效。

      8、小结

      Java17中所做的所有改进都传达了一个信息:是时候切换到这个版本了。过渡承诺语法更简洁,性能得到提高。你的项目将获得安全性、灵活性和更好的错误消息。如果你已经迁移到Java11,那么迁移到Java17 会很顺利。Java的竞争优势在这里大放异彩,因为向后兼容性允许你切换到Java17而无需更改任何代码,并利用所有更新的功能。Java17是Java11以来又一个LTS(长期支持)版本,可确保你在较长时间内收到所有必要的安全更新。

      文章内容仅供阅读,不构成投资建议,请谨慎对待。投资者据此操作,风险自担。

    即时

    新闻

    明火炊具市场:三季度健康属性贯穿全类目

    奥维云网(AVC)推总数据显示,2024年1-9月明火炊具线上零售额94.2亿元,同比增加3.1%,其中抖音渠道表现优异,同比有14%的涨幅,传统电商略有下滑,同比降低2.3%。

    企业IT

    重庆创新公积金应用,“区块链+政务服务”显成效

    “以前都要去窗口办,一套流程下来都要半个月了,现在方便多了!”打开“重庆公积金”微信小程序,按照提示流程提交相关材料,仅几秒钟,重庆市民曾某的账户就打进了21600元。

    3C消费

    华硕ProArt创艺27 Pro PA279CRV显示器,高能实力,创

    华硕ProArt创艺27 Pro PA279CRV显示器,凭借其优秀的性能配置和精准的色彩呈现能力,为您的创作工作带来实质性的帮助,双十一期间低至2799元,性价比很高,简直是创作者们的首选。

    研究

    中国信通院罗松:深度解读《工业互联网标识解析体系

    9月14日,2024全球工业互联网大会——工业互联网标识解析专题论坛在沈阳成功举办。