首页 > 编程语言 >JAVA - 记录

JAVA - 记录

时间:2023-10-15 21:37:36浏览次数:30  
标签:JAVA Point int double 记录 构造 record public

有时,数据就是数据,而面向对象程序设计提供的数据隐藏有些碍事,考虑一个类,这个类描述平面上的一个点,有下x和y坐标

package com.demo;

public class Ponint {
    private final double x;
    private final double y;

    public Ponint(double x, double y) {
        this.x = x;
        this.y = y;
    }


    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }
    @Override
    public String toString() {
        return "Ponint{" +
                "x=" + x +
                ", y=" + y +
                '}';
    }

}

这里隐藏了x和y,然后通过获取方法获取这些值,这种做法确实对我们有好处吗?我们将来想改变Point类的实现吗? 为了更简洁的定义这些类,JDK14 引入了一个预览特性:"记录",最终在JDK版本16中发布

记录(record) 是一种特殊形式的类,其状态不可变, 而且公共可读,可以如下将Point 定义为一个记录

public record Point(double x, double y) {
}

其结果是有以下实例字段的类:
private final double x;
private final double y;

在Java语言规范中,一个记录的实例字段称为组件(component)
这个类有一个构造器:
point(double x, double y)
和以下访问器方法:
public double x()
public double y()

public record Point(double x, double y) {

    public static void main(String[] args) {
        Point point = new Point(3, 2);
        System.out.println(point.x() + "  " + + point.y());  //3.0  2.0
    }
}

构造器分为:标准、自定义、简洁

标准构造器:自动定义地设置所有实例字段的构造器称为标准构造器

自定义构造器:

/*
1.这种构造器的第一个语句必须调用另外一个构造器,所以最终会调用标准构造器
2.这个记录有两个构造器:标准构造器和一个生成原点的无参数构造器
*/
public record Point(double x, double y) {
    public Point(){
        this(0,0);
    }
}

如果标准构造器需要完成额外的工作,那么可以提供你自己的实现:

public record Range(int from ,int to) {
    
    public Range(int from,int to){
        if (from <= to){
            this.from = from;
            this.to = to;
        }else{
            this.from = to;
            this.to = from;
        }
    }

不过,实现标准构造器时,建议使用一种简洁(compact)形式,不用指定参数列表:

record Range(int from, int to) {

    public Range {
        if (from > to) {
            int temp = from;
            from = to;
            to = temp;
        }
    }
}

简洁形式的主体是标准构造器的“前奏”。它只是为实例字段this.from和this.to赋值之前修改变量from和to。不能在简洁构造器的主体中读取或修改实例字段

以下写法也会产生错误的结果:

标签:JAVA,Point,int,double,记录,构造,record,public
From: https://www.cnblogs.com/czzz/p/17766214.html

相关文章

  • 单例模式--Java实现
    画类图具体代码实现//StudentNo.javapackageorg.example.design005;publicclassStudentNo{privatestaticStudentNoinstance=null;privateStudentNo(){}publicstaticStudentNogetInstance(){if(instance==null){System.ou......
  • 造题记录:如何出强制在线题
    今天造了一个数据结构题,具体题面是什么就不说了,题目名称是sosomst。输入格式是,第一行\(n,typ\),接下来两行的点权,然后是一棵树。输出\(n-1\)行的数字,树边强制在线。以下是我生成这题数据的方法。std.cpp肯定是自己写了,但是先不要实现强制在线。将std.cpp编译为可执行文件......
  • Java 数组与List转换
    示例@Testvoidstr2arr(){Stringids="1,2,3,4,5,6";//字符串-->String数组String[]arrayStr=ids.split(",");System.out.println(arrayStr);}@Testvoidlist2Str(){List<......
  • java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest no
    完整的报错信息java.lang.TypeNotPresentException:Typejavax.servlet.http.HttpServletRequestnotpresent atjava.base/sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:117)~[na:na] atjava.base/sun.reflect.generics......
  • 用Java语言简单实现MQ消息队列服务
    大致的结构:一个消息队列大致的结构:消息处理中心Brokerpackagecom.tntxia;importjava.util.concurrent.ArrayBlockingQueue;/***消息处理中心*/publicclassBroker{//队列存储消息的最大数量privatefinalstaticintMAX_SIZE=3;//保存消息数据......
  • java线程
    Java虚拟机(JVM,是运行所有Java程序的抽象计算机,是Java语言的运行环境)允许应用程序并发地运行多个线程。在Java语言中,多线程的实现一般有以下三种方法:1、实现Runnable接口,并实现该接口的run()方法。①自定义类并实现Runnable接口,实现run()方法。②创建Thread对象,用实现Ru......
  • 《Head First JavaScript程序设计》高清高质量 原版电子书PDF+源码
    下载:https://pan.quark.cn/s/9b368a216582......
  • 原型模式--Java实现
    画类图浅克隆:深克隆:具体代码实现浅克隆具体代码://Vector.javapackageorg.example.design004;importjava.lang.reflect.Array;importjava.util.Arrays;publicclassVectorimplementsCloneable{publicint[]getArray(){returnarray;}......
  • 2023_10_15_DAY_01_JAVA_SE_Java基础知识_下_流程控制语句
    2023_10_15_DAY_01_JAVA_SE_Java基础知识_下_流程控制语句分支【选择】结构if语句if(表达式){ 执行语句块;}//if语句的代码执行过程为:如果条件表达式返回真值,则执行功能代码块中的语句;//如果条件表达式返回值为假,则不执行功能代码块。语法说明:if是该语句中的关键字,后......
  • 2023年了都,不会还有入坑Java 的吧?^?
    初识Java一、java语言历史概述Java语言是Sun公司于1990年开发的,当时Green项目小组的研究人员正在致力于为未来的智能设备开发一种新的编程语言。对于新语言的设计,Sun公司研发人员并没有开发一种全新的语言,而是根据嵌入式软件的要求,对C++进行了改造,去除了留在C++的一些不太......