前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Objects, Immutability, and Switch Expressions 49-57

Objects, Immutability, and Switch Expressions 49-57

原创
作者头像
luoheng
发布2022-10-29 09:23:16
2310
发布2022-10-29 09:23:16
举报
文章被收录于专栏:luohengluoheng

本文为《Java Coding Problems》49-57题,问题涉及Objects, Immutability, and Switch Expressions (共18题 40-57)。

49. 写一个不可变的类

问题:写一个不可变的类

思路:

不可变类的几个要点:

  1. 类必须用final标注,防止继承。
  2. 所有的字段都是private final的,只在构造器中初始化一次。
  3. 提供一个public的包含所有字段的构造器,或者提供一个工厂方法。
  4. 提供字段的getter方法。
  5. 不提供字段的setter方法。

代码如下:

代码语言:java
复制
public final class Point {
    private final double x;
    private final double y;

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

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }
}

50. 从不可变类中返回一个可变的对象

问题:如果不可变类包含一个可变的对象,那如何保持类的不可变性?

思路:在构造方法和可变对象的getter中进行对象拷贝。

代码如下:

代码语言:java
复制
// 这是个可变对象
class Radius {
    int start;
    int end;
}

public final class Point {

    private final double x;
    private final double y;
    // 这是个可变对象的字段
    private final Radius radius;

    private Radius cloneRadius(Radius radius) {
        Radius clone = new Radius();
        clone.start = radius.start;
        clone.end = radius.end;
        return clone;
    }

    public Point(double x, double y, Radius radius) {
        this.x = x;
        this.y = y;
        // 在构造不可变对象的时候,复制这个可变对象
        this.radius = cloneRadius(radius);
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

    public Radius getRadius() {
        // 在返回可变对象的时候,复制可变对象
        return cloneRadius(radius);
    }
}

51. 使用Builder模式写一个不可变类

问题:当类的字段特别多时,且部分字段可选,提供一个全字段构造器不太方便,使用Builder模式更加合理。

代码如下:

代码语言:java
复制
public final class Point {

    private final double x;
    private final double y;
    private final String description;

    private Point(PointBuilder pointBuilder) {
        this.x = pointBuilder.getX();
        this.y = pointBuilder.getY();
        this.description = pointBuilder.getDescription();
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

    public String getDescription() {
        return description;
    }

    public static final class PointBuilder {
        private final double x;
        private final double y;
        // description是可选的
        private String description;

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

        public PointBuilder description(String description) {
            this.description = description;
            return this;
        }


        public double getX() {
            return x;
        }

        public double getY() {
            return y;
        }

        public String getDescription() {
            return description;
        }
        
        public Point build() {
            return new Point(this);
        }
    }
}

52. 避免不可变对象中的坏数据

问题:不可变对象初始化后就不能再改变了,所以需要防止错误的初始化。

思路:JSR 380使得可以通过注解进行字段校验。Hibernate Validator提供了一些annotations,比如@NotNull, @Min, @Max, @Size, @Email。在创建不可变对象的时候进行校验,如果校验失败,则初始化失败。

53. 复制对象

问题:如何复制一个对象。

思路:复制对象有很多种方式,例如:

  1. 手动复制,写一个方法,new一个新对象,把字段拷贝过去。
  2. 实现Cloneable接口,重写clone()方法(记得调用super.clone())。
  3. 通过构造函数复制,类似于C++中的复制构造函数。
  4. 通过第三方clone库,如Cloner
  5. 通过序列化复制一个对象。
  6. 通过json复制一个对象。

54. 重写toString

问题:为什么要重写toString方法,如何合理的重写?

思路:toString方法在打印一个对象时被调用,是debug,记录log时不可缺少的方法。但由于toString方法的默认实现只是返回对象的hashCode,不利于对象展示,所以需要重写。

一般而言,toString应包含对象的所有字段,但要注意剔除敏感数据,比如用户密码等。

55. Switch表达式

问题:JDK12提供了Switch表达式。

思路:略。

56. Switch多标签case

问题:JDK12允许Switch语句中一个case有多个选项。

思路:略

57. Switch表达式语句块

问题:JDK12提供了Switch表达式,其每一个case都可以返回一个值,case后面可以是语句块。

思路:略。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 49. 写一个不可变的类
  • 50. 从不可变类中返回一个可变的对象
  • 51. 使用Builder模式写一个不可变类
  • 52. 避免不可变对象中的坏数据
  • 53. 复制对象
  • 54. 重写toString
  • 55. Switch表达式
  • 56. Switch多标签case
  • 57. Switch表达式语句块
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档