密封类可以列出的子类的最大数量是多少(类似于接口):
public sealed class Foo permits A, B, C {
// How many sub classes can ^^^^^^^
// be listed here?
}
Run Code Online (Sandbox Code Playgroud)
该语言实际上是否定义了限制?即,在语言层面上它实际上是无限的吗?
如果语言层面没有这样的限制,那么似乎实现仍然必须有技术限制。某个地方应该有一个列表来存储允许的子类的某种表示形式。我希望那时使用 16 或 32 位整数。
如果我正确地阅读了 JLS \xc2\xa78.1.6和\xc2\xa79.1.4,则密封类/接口允许的类只是直接子类/接口。
\n为了说明这一点,请考虑以下示例:
\npublic sealed interface I1 permits I2, C, D { /*...*/ }\npublic final class C implements I1 { /*...*/ }\npublic final class D implements I1 { /*...*/ }\n\npublic sealed interface I2 extends I1 permits E, F { /*...*/ }\npublic final class E implements I2 { /*...*/ }\npublic final class F implements I2 { /*...*/ }\nRun Code Online (Sandbox Code Playgroud)\n如果我正确理解了规范,I1显然允许CandD但不允许Eand F(通过fromextends的层次结构)。它是否正确?I2 …
Set给定以下代码片段,其中创建了a 的临时实例,今天的 Java 编译器是否会发现它们不需要为每个循环传递创建实例并优化set为一种最终常量,以便该实例与整个循环?该问题同样适用于whileanddo while循环。
for (/* a loop that iterates quite often */)
{
var set = Set.of("foo", "blah", "baz");
// Do something with the set.
}
Run Code Online (Sandbox Code Playgroud)
我还感兴趣是否已经在编译时完成了这样的优化(意味着字节码已经被优化),或者是否存在本质上实现相同效果的运行时优化(由即时编译器进行)。
如果编译器没有看到这一点,唯一的选择似乎是实例化set循环外部以获得最佳效果:
var set = Set.of("foo", "blah", "baz");
for (/* a loop that iterates quite often */)
{
// Do something with the set.
}
Run Code Online (Sandbox Code Playgroud)
旁注,对于那些发现第一个片段相当糟糕的做法并且无论如何都会像第二个片段一样编写它的人:这个片段实际上是我的真实用例的简化变体,是为了问题的简单性而制作的。让我想到这个问题的真实的、稍微复杂的用例如下,其中需要检查一个字符串是否是极少数字符串之一:
for (/* a loop that iterates quite often */)
{
// ... …Run Code Online (Sandbox Code Playgroud) 我最近使用推荐的方式将我的 Eclipse 安装从 2020-06 (4.16) 升级到 2020-09 (4.17) 。重新启动后,在打开我使用多年的同一个工作区时,某些视图在选择时缺少关闭按钮/图标
这似乎是一个已知问题。但是,关闭视图并重新打开它(如该页面上的建议)对我来说不起作用 - 图标/按钮仍然丢失。我还尝试过关闭视图、重新启动 Eclipse、重新打开视图,以及在使用参数启动 Eclipse 时尝试-clean。这也没有帮助。
有趣的是,对于某些视图,会显示图标/按钮。
还有什么办法可以恢复图标/按钮?