什么情况下会someEnum.describeConstable()
不返回EnumDesc
?
即它将返回一个空的Optional
。
该方法Optional<? extends ConstantDesc> describeConstable()
源于接口Constable
,而不是源于Enum
. 来自Constable
的文档:
...
constable 类型实例的名义形式是通过
describeConstable()
. AConstable
不需要能够(或可能选择不)以 a 的形式描述其所有实例ConstantDesc
;此方法返回一个Optional
可以为空的,表示无法为实例创建名义描述符。(例如,MethodHandle
将为直接方法句柄生成名义描述符,但不一定是由方法句柄组合器生成的那些。)...
请参阅 Java™ 虚拟机规范:
4.4 常量池,4.4.10 CONSTANT_InvokeDynamic_info 结构
...
describeConstable()
是继承自 interface 的方法Constable
,其中描述为:
如果可以构造,则返回包含此实例的名义描述符,如果
Optional
无法构造,则返回空Optional
。
当然,在某些类中,例如Integer
,它永远不能为空:
返回一个
Optional
包含此实例的名义描述符,即实例本身。
但是返回值是一个,Optional
因为这对于接口的所有实现都不是真的。
的 javadocConstable
有这样的说法:
Constable 不需要能够(或可能选择不)以
ConstantDesc
;的形式描述其所有实例。此方法返回一个Optional
可以为空的,表示无法为实例创建名义描述符。(例如,MethodHandle
将为直接方法句柄生成名义描述符,但不一定是由方法句柄组合器生成的那些。)