Objects, Immutability, and Switch Expressions 49-57
and switch Objects 57 49 Expressions
2023-06-13 09:14:13 时间
本文为《Java Coding Problems》49-57题,问题涉及Objects, Immutability, and Switch Expressions (共18题 40-57)。
49. 写一个不可变的类
问题:写一个不可变的类
思路:
不可变类的几个要点:
- 类必须用
final
标注,防止继承。 - 所有的字段都是
private final
的,只在构造器中初始化一次。 - 提供一个
public
的包含所有字段的构造器,或者提供一个工厂方法。 - 提供字段的
getter
方法。 - 不提供字段的
setter
方法。
代码如下:
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
中进行对象拷贝。
代码如下:
// 这是个可变对象
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模式更加合理。
代码如下:
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. 复制对象
问题:如何复制一个对象。
思路:复制对象有很多种方式,例如:
- 手动复制,写一个方法,
new
一个新对象,把字段拷贝过去。 - 实现
Cloneable
接口,重写clone()
方法(记得调用super.clone()
)。 - 通过构造函数复制,类似于
C++
中的复制构造函数。 - 通过第三方
clone
库,如Cloner
。 - 通过序列化复制一个对象。
- 通过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后面可以是语句块。
思路:略。
相关文章
- ORA-01126: database must be mounted in this instance and not open in any instance ORACLE 报错 故障修复 远程处理
- ORA-26534: collision: tranID number ignored and purged ORACLE 报错 故障修复 远程处理
- ORA-26901: string propagation sender in the combined capture and apply mode is to be suspended while apply is disabled. ORACLE 报错 故障修复 远程处理
- ORA-53001: and tag values are null ORACLE 报错 故障修复 远程处理
- ORA-56702: consumer group string is for internal use only and cannot be a switch target ORACLE 报错 故障修复 远程处理
- MySQL Error number: MY-010677; Symbol: ER_NDB_BINLOG_CANT_CREATE_EVENT_IN_DB_AND_CANT_DROP; SQLSTATE: HY000 报错 故障修复 远程处理
- ORA-01854: julian date must be between 1 and 5373484 ORACLE 报错 故障修复 远程处理
- Unleashing the Power of Oracle VIP: Enhancing Authentication and Security(oraclevip作用)
- 使用MySQL中的Switch语句进行简单而高效的数据筛选(mysql中switch)
- Managing Your Database with MySQL Data Files: Tips and Best Practices(mysql数据文件)
- 服务器部署,实现高可用性Note As an AI language model I can only provide a heading according to the keywords given to me It may or may not make sense Kindly proofread the language tone and content once generated by AI
- Oracle 数据库中使用AND拼接的威力(oracle中and拼接)