gpt4 book ai didi

在构造函数调用的函数中定义成员时的 Java 不变性

转载 作者:行者123 更新时间:2023-11-29 06:58:06 26 4
gpt4 key购买 nike

我有这样的类(class):

abstract class Parent {
protected Parent(Raw rawData) {
deserialize(rawData);
}
protected abstract void deserialize(Raw rawData);
}

class Child extends Parent {
final byte firstByte;
public Child(Raw rawdData) { super(rawData); }
protected void deserialize(Raw rawData) {
firstByte = rawData.getFirst();
}
}

所以基本上任何扩展 Parent 的子类都会定义一个 deserialize() 来反序列化 rawData 以填充它们的成员变量,并且在它们的构造函数中它们只会执行 super(rawData) 。子类的反序列化函数会自动执行。

错误信息:

Child.java:5: error: cannot assign a value to final variable firstByte
firstByte = rawData.getFirst();

但是这样做 Java 不允许我将成员变量定义为 final 这很奇怪,因为我在构造函数中进行初始化。执行相同功能但允许成员成为 final 的最佳方法是什么?

最佳答案

当你调用 super 构造函数时,对象的“ super ”部分正在构造,而对象的“子”部分完全是一片荒地;你不能读或写它;实际上,“子”部分在概念上什至可能不存在。

调用抽象方法的 super 构造函数是一个非常糟糕的主意,因为它可能依赖于尚不存在的子类状态。

关于在构造函数调用的函数中定义成员时的 Java 不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30895513/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com