gpt4 book ai didi

java - 为什么 StructuredArray 需要是不可构造的?

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:06:42 26 4
gpt4 key购买 nike

This talk在 34:00 介绍了 Java 的 StructuredArray 设计。一切都很清楚,除了以下几点:

它不应该是可构造的,也就是说,实例可能只能通过一些静态工厂方法获得,比如newInstance .同时,它们应该是可子类化的,这意味着必须有一个公共(public)构造函数,并且在运行时保证不可构造性。这听起来很老套,所以我想知道为什么?

我了解工厂的一般优势,尤其是静态工厂方法。但是我们从这里得到了什么,以便让黑客可以接受?

最佳答案

StructuredArray class 是有一天它可以被一个内部实现所取代,该实现将整个数组(包括组件对象)分配为一个长内存块。 发生这种情况时,对象的大小将取决于元素的数量和元素类

如果StructuredArray有一个公共(public)构造函数,那么你可以写 x = new StructuredArray<>(StructuredArray.class, MyElement.class, length) .这似乎没有任何问题,除了在 bytecode 中,这变成了 new。分配对象的指令,然后是一个单独的 invokespecial调用对象的构造函数的指令。

您看到了问题 -- new指令必须分配对象,但它不能,因为对象的大小取决于它没有的构造函数参数(元素类和长度)!直到稍后某个时候的构造函数调用时,它们才会被传递。

有很多方法可以解决这样的问题,但它们都有点恶心。将构造封装在静态工厂方法中更有意义,因为那样你就不能写 new StructuredArray... ,并且 JVM 不必使用任何“魔法”来计算在 new 中分配多少内存。 StructuredArray 的说明,因为根本不可能有任何此类说明*。

如果后来的一些 JVM 想要提供分配连续数组的静态工厂的内部实现,那么这没问题——它在工厂方法调用中获得所需的所有信息。

注意* - 是的,好的,技术上你可以new StructuredArray... ,但它不会为您提供有用的对象。

关于java - 为什么 StructuredArray 需要是不可构造的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38513243/

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