当前位置: 首页 > news >正文

百度建立企业网站建设的目的驾校推广网络营销方案

百度建立企业网站建设的目的,驾校推广网络营销方案,造价员建设部网站,网站怎么做内容1、介绍 在许多 java 应用程序中,在对象之间传递不可变数据是很常见的。 在Java14之前,我们需要创建一个带有字段和方法的类,随着Java14的发布,我们现在可以使用 record 关键字来解决这些问题。 下面我将介绍record关键字的基本…

1、介绍

在许多 java 应用程序中,在对象之间传递不可变数据是很常见的。

在Java14之前,我们需要创建一个带有字段和方法的类,随着Java14的发布,我们现在可以使用 record 关键字来解决这些问题。

下面我将介绍record关键字的基本原理,包括其用途、生成的方法和支持的能力。

2、目的

通常我们写一个class可以来承载一些数据,比如 数据库 查询结果,或是通过service获取的返回结果。大部分时候,这些数据是 不可变 的,因为不可变性确保了数据的有效性,而无需考虑并发。

为了创建一个不可变类,我们需要做以下几件事:

1. 每个字段是private并且是final的

2. 每个字段需要有个getter方法

3. 需要有个构造方法并且参数包含所有字段

4. 还需要包含所有字段的equals方法,以及对应的hashcode方法和toString方法

比如我们需要创建一个Person类,包含name和address两个字段:

public class Person {private final String name;private final String address;public Person(String name, String address) {this.name = name;this.address = address;}@Overridepublic int hashCode() {return Objects.hash(name, address);}@Overridepublic boolean equals(Object obj) {if (this == obj) {return true;} else if (!(obj instanceof Person)) {return false;} else {Person other = (Person) obj;return Objects.equals(name, other.name)&& Objects.equals(address, other.address);}}@Overridepublic String toString() {return "Person [name=" + name + ", address=" + address + "]";}// standard getters
}

为了达到我们的需求,我们这里有两个小问题:

1. 这个类里包含太多样板化的代码了

2. 我们为了写一个Person类包含name和address两个字段,写了太多别的东西从而让这个类太复杂了

第一种情况,我们必须对每个这种class重复相同的繁琐过程,为每个数据段单调地创建一个新字段,创建equals、hashCode和toString方法,并创建一个接受每个字段的构造函数。

虽然现在很多IDE可以自动生成这些代码,但是有个问题是它们没办法去在我们修改字段后主动的更新对应生成的代码。比如我新增一个age字段,构造方法、equals方法之类的我都要删了重写,IDE没法自动更新,而且还很容易遗漏或是忘记更新这些方法。

第二种情况,额外的代码掩盖了我们的类只是一个数据类,它有两个字符串字段:name和address。

更好的方法是显式声明我们的类是一个数据类。

3、基础用法

下面就要请出我们的 record 关键字了。

在jdk14,我们可以用record关键字替换重复的数据类。record是不可变的数据类,只需要字段的类型和名称。equals、hashCode和toString方法以及private、final字段和public的构造函数都是由Java编译器生成的。

下面我们来看看jdk14用record关键字怎么创建这个包含name和address的Person。

public record Person (String name, String address) {}

没错,就是这么简单的实现了。

3.1、生成的构造方法

用record关键字,创建出的构造方法如下:

public Person(String name, String address) {this.name = name;this.address = address;
}

record生成的构造方法,和一般的class的构造使用方式没什么区别:

Person person = new Person("John Doe", "100 Linda Ln.");

作者ps:其实这里看生成的代码会发现,其实他是创建了个final的Person类,然后继承了java.lang.Record,不过Record类也是final的,我们自己写代码的时候是没法继承的。

3.2、生成的getters方法

用record关键字后,同样为我们生成了getters方法,只不过和我们传统使用的调用有点区别,看下面的测试用例:

@Test
public void givenValidNameAndAddress_whenGetNameAndAddress_thenExpectedValuesReturned() {String name = "John Doe";String address = "100 Linda Ln.";Person person = new Person(name, address);assertEquals(name, person.name());assertEquals(address, person.address());
}

它生成的是不含get前缀的。

3.3、生成的equals方法

用record关键字后,同样为我们生成的对应的equals方法,测试用例如下:

@Test
public void givenSameNameAndAddress_whenEquals_thenPersonsEqual() {String name = "John Doe";String address = "100 Linda Ln.";Person person1 = new Person(name, address);Person person2 = new Person(name, address);assertTrue(person1.equals(person2));
}

只要是同一个对象,或是每个字段都相等,就会是true。

3.4、生成的hashCode方法

和equals一样,为我们生成的hashCode方法,测试用例如下:

@Test
public void givenSameNameAndAddress_whenHashCode_thenPersonsEqual() {String name = "John Doe";String address = "100 Linda Ln.";Person person1 = new Person(name, address);Person person2 = new Person(name, address);assertEquals(person1.hashCode(), person2.hashCode());
}

当然也是任何的字段不一样就会返回不一样的code值,所有字段都一样返回相同的code值。但是返回相同code值不代表所有字段都一样(毕竟有碰撞概率)。

3.5、生成的toString方法

一个name为“John Doe”,address为“100 Linda Ln.”的Person,toString样例如下:

Person[name=John Doe, address=100 Linda Ln.]

4、构造方法

虽然为我们生成了一个public的构造方法,但我们仍然可以自定义其他构造方法的实现。

此定制旨在用于验证,并应尽可能简单。

比如我们要确保传入的name和address两个字段都不为空,那么我们可以这样自定义构造方法:

public record Person(String name, String address) {public Person {Objects.requireNonNull(name);Objects.requireNonNull(address);}
}

或者我们可以提供一些值包含默认值:

public record Person(String name, String address) {public Person(String name) {this(name, "Unknown");}
}

当然可以使用this.name来赋值也是一样的,但是由于所有字段默认都是final的,所以要求我们自定义的构造方法必须覆盖所有字段。

但是如果我们同时生命无参的构造,也重新覆盖定义全参数的构造,会导致编译报错,示例如下:

public record Person(String name, String address) {public Person {Objects.requireNonNull(name);Objects.requireNonNull(address);}public Person(String name, String address) {this.name = name;this.address = address;}
}

5、静态变量和静态方法

和class一样,record修饰的类也可以包含静态变量和静态方法,使用方法和在class里面是一样的。

public record Person(String name, String address) {public static String UNKNOWN_ADDRESS = "Unknown";
}
public record Person(String name, String address) {public static Person unnamed(String address) {return new Person("Unnamed", address);}
}

调用方式也和class是一样的。

Person.UNKNOWN_ADDRESS
Person.unnamed("100 Linda Ln.");

6、小结

在本文中,我们研究了Java14中引入的record关键字,包括它们的基本概念和复杂性。

使用record,以及对应由编译器生成的方法,我们可以减少样板代码并提高不可变类的可靠性。

作者ps:当然lombok可以通过注解来生成这些东西,但是record关键字我认为更多的还是关注的一个不可变性吧。

http://www.lbrq.cn/news/2641321.html

相关文章:

  • 网站你懂我意思正能量晚上在线观看不用下载免费魅族seo如何提升排名收录
  • 媒体发稿网站开发seo分析工具
  • 网站建设技术交流网站加速
  • 大良网站建设价格北京网站建设公司优势
  • 提供佛山顺德网站建设网站外链工具
  • 范例网站怎么做泉州关键词优化排名
  • 屏山移动网站建设百度推广课程
  • 网站首页效果图怎么设计《新闻联播》今天
  • 网站开发及app开发报价seo独立站优化
  • 制作一个静态网页优化软件刷排名seo
  • 网站建设和网络推广是干嘛seo高级优化技巧
  • 工信部网站报备搜狗输入法下载安装
  • 销售网站平台搭建营销方式
  • 郑州网站建设大华伟业网站接广告
  • 厦门公司网站建设数字营销策略有哪些
  • 网站建设维护费合同深圳优化服务
  • 自己建立公司网站 怎样做全网营销系统是干什么的
  • 查建设工程规划许可证在哪个网站东莞网站建设优化技术
  • 个人网站搭建步骤关键词自动生成器
  • 海口做网站郑州seo网站排名
  • 丹东seo排名公司无锡网站建设方案优化
  • 做301重定向会影响网站权重吗设计外包网站
  • 云梦网络 网站模板搜索引擎推广方案
  • 郑州微信公众号网站建设关键词优化举例
  • 设计网站怎么做的淄博头条新闻今天
  • 美国做按摩广告的网站上海搜索引擎优化1
  • 在线建设网站搜索网站关键词
  • 网站图片一般多大尺寸外贸软件排行榜
  • 阅读分享网站模板怎样免费建立自己的网站
  • 信阳做网站汉狮网络石家庄做网站推广排名的公司
  • 二叉树实现
  • 第七篇:动画基础:requestAnimationFrame循环
  • WORD接受修订,并修改修订后文字的颜色
  • Money Sums
  • Java基础学习1(Java语言概述)
  • OpenAI 开源模型 GPT-OSS深度拆解:从1170亿参数到单卡部署,重构AI开源生态