首页 > 图灵资讯 > 技术篇>正文

Java 中的 Setters 和 Record

2024-10-22 21:52:37

java 中的 setters 和 record

record 是一种结构体,其特点是不可变,即 record 类型的对象一旦创建,其属性就无法修改,即等价其他编程语言称之为数据类或dto(数据传输对象)。但是,如果需要使用 setter 方法修改某个属性,并且考虑到记录中的每个属性都是 final 类型,那么如何实现呢?

为了证明这是否可行,我们将创建一个记录 product,它具有名称和价格两个属性,以及在 java 中定义记录时自动创建的相应方法:

public record product(string name, double price) { }

现在,如果你创建一个 product 类型的对象并尝试修改 name 属性,你会发现这是不可能的,甚至没有 setter 方法来做到这一点:

product p = new product("bread", 1.0);
p.setname("water"); // error: cannot resolve method 'setname' in 'product'

但是,如果我们知道 record 可以有其他方法,那么我们可以创建一个 setname(string name) 方法来修改 name 属性并为其分配新值,因为答案是否定的. ,它不像普通课堂那样工作,例如:

public record product(string name, double price) {
    // error: cannot asign a value to final variable 'name'
    public void setname(string name) {
        this.name = name;
    }
}

那么如何在java中修改记录的属性呢?答案是,如果 set 方法返回 record 的新实例及其每个属性,并且显然带有修改后的属性,则可以。这个过程可能有点乏味,具体取决于记录具有的属性数量。

public record product(string name, double price) {

    public product setname(string name) {
        return new product(name, this.price);
    }

    public product setprice(double price) {
        return new product(this.name, price);
    }

}

这样,当调用任何一个setter方法时,都会获得一个具有修改属性的product类型的新实例,例如:

product p = new product("bread", 1.0);
product q = p.setname("milk");
product r = q.setprice(2.0);

对于每个对象 p、q 和 r,其 get、equals、hashcode 和 tostring 方法都可以正常调用,考虑到没有一个对象彼此相等,因为每个对象的属性值都不同。

public class Main {
    public static void main(String[] args) {
        Product p = new Product("Bread", 1.0);
        Product q = p.setName("Milk");
        Product r = q.setPrice(2.0);

        System.out.println(p); // Product[name=Bread, price=1.0]
        System.out.println(q); // Product[name=Milk, price=1.0]
        System.out.println(r); // Product[name=Milk, price=2.0]

        System.out.println(p.equals(q)); // false
        System.out.println(q.equals(r)); // false
        System.out.println(r.equals(p)); // false
    }
}

此时,考虑到记录被设计为一种允许以简单的方式存储和传输信息的结构,考虑这种方法是否适合要解决的问题非常重要。在应用程序中的方式并且是不可变的,或者如果需要具有更大灵活性的结构,那么应该使用 class 。有关何时使用记录或类的更多信息,您可以参考以下帖子。

以上就是Java 中的 Setters 和 Record的详细内容,更多请关注图灵教育其它相关文章!

上一篇 重新抛出异常
下一篇 返回列表

文章素材均来源于网络,如有侵权,请联系管理员删除。