问题标签 [static-initializer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
248347 浏览

java - 静态和非静态初始化代码块有什么区别

我的问题是关于静态关键字的一种特殊用法。可以使用static关键字来覆盖类中不属于任何函数的代码块。例如下面的代码编译:

如果您删除static关键字,它会抱怨,因为变量afinal. 但是,可以同时删除finalstatic关键字并使其编译。

这两种方式都让我感到困惑。我应该如何拥有一个不属于任何方法的代码部分?怎么可能调用它?一般来说,这种用法的目的是什么?或者更好的是,我在哪里可以找到有关此的文档?

0 投票
6 回答
4517 浏览

java - 再次调用静态初始化器

一旦加载了一个类,有没有办法再次调用静态初始化器?

编辑:

我需要调用静态初始化程序,因为我没有编写原始类,并且我需要调用的逻辑是在静态初始化程序中实现的。

0 投票
6 回答
1850 浏览

java - 我可以保证在 Java 中运行静态初始化程序的顺序吗?

我有一个 Set 类(这是 J2ME,所以我对标准 API 的访问权限有限;只是为了解释我明显的轮子改造)。我正在使用我的集合类在类和子类中创建常量集合。有点像这样...

一切看起来都很好,除了 [1] 处的行导致空指针异常。大概这意味着子类中的静态初始化器在父类之前运行。这让我感到惊讶,因为我认为它会先在任何新导入中运行静态块,然后再在实例化子类中运行任何块。

我的这个假设是对的吗?有没有办法控制或解决这种行为?

更新:

事情就更奇怪了。我尝试了这个(注意'new ParentClass()'行):

输出很奇怪:

因此 ParentClass 已初始化,但子类在其静态初始化程序中无权访问它。

0 投票
10 回答
71213 浏览

java - Java 中初始化器与构造器的使用

所以我最近一直在复习我的 Java 技能,并发现了一些我以前不知道的功能。静态和实例初始化器就是两种这样的技术。

我的问题是什么时候会使用初始化程序而不是在构造函数中包含代码?我想到了几个明显的可能性:

  • 静态/实例初始化器可用于设置“最终”静态/实例变量的值,而构造函数不能

  • 静态初始化器可用于设置类中任何静态变量的值,这应该比在每个构造函数的开头使用“if (someStaticVar == null) // do stuff”代码块更有效

这两种情况都假设设置这些变量所需的代码比简单的“var = value”更复杂,否则似乎没有任何理由使用初始化程序而不是在声明变量时简单地设置值。

然而,虽然这些并不是微不足道的收获(尤其是设置最终变量的能力),但似乎确实有相当有限的情况应该使用初始化程序。

一个人当然可以使用初始化器来完成构造函数中所做的很多事情,但我真的不明白这样做的原因。即使一个类的所有构造函数共享大量代码,对我来说,使用私有 initialize() 函数似乎比使用初始化器更有意义,因为它不会锁定你在编写新代码时运行该代码构造函数。

我错过了什么吗?是否还有许多其他情况需要使用初始化程序?或者它真的只是在非常特定的情况下使用的一个相当有限的工具?

0 投票
6 回答
49827 浏览

java - Java静态初始化器线程安全吗?

我正在使用静态代码块来初始化我拥有的注册表中的一些控制器。因此,我的问题是,我可以保证这个静态代码块在类第一次加载时绝对只会被调用一次吗?我知道我无法保证何时调用此代码块,我猜是 Classloader 第一次加载它的时间。我意识到我可以在静态代码块中的类上同步,但我猜这实际上是怎么回事?

简单的代码示例是;

还是我应该这样做;

0 投票
4 回答
729 浏览

.net - 静态初始化器和线程同步 (.NET)

静态初始化程序应该在第一次引用类之前执行一次。这意味着每次访问一个类时,都应该检查该类的静态初始化器是否被执行。
似乎在多线程环境中,具有非平凡静态初始化程序的类可能是争用的来源,因为当多个线程访问该类时需要同步。
我的问题是最小化这种隐式锁对静态初始化器引入的类定义的影响的最佳方法是什么?

0 投票
6 回答
438 浏览

java - 与使用静态初始化器作为伪入口点相比,main(...) 有什么好处?

java中程序的入口点通常是这样的

但是,由于 main 中只有一个 SOP,所以上面的类可能是这样的

使用 main(...) 的一个明显优势是可以将参数传递给程序。另一个(我在这里猜测)可能与垃圾收集器以不同方式处理在静态块中创建的对象有关。

使用语言定义的入口点还有哪些其他好处 - public static void main( String args[] ) 而不是使用静态初始化程序。

ps 以上片段仅供参考,可能无法编译

0 投票
5 回答
3163 浏览

php - 我应该如何弥补 PHP 中静态初始化器的不足?

我正在考虑将每个类放入一个单独的文件中,并在类定义之外进行静态初始化。

问题在于,初始化将在实际需要所述类之前发生(它会在第一次包含包含该类的文件时发生)。这是一个问题,因为可能根本不会使用该类,因此不需要初始化。而且我认为将使用过的文件包含在代码开头的做法只是一种肮脏的技术。

如果有人对此问题有可行的解决方案,我将不胜感激。

0 投票
3 回答
6554 浏览

c# - 静态类中静态字段的初始化顺序

给出以下代码:

是否保证在我使用它的长度分配给之前myChars将被初始化?myCharsSize

0 投票
6 回答
530 浏览

java - Java:什么是静态{}?

有人可以解释一下下面是什么吗?

这个 static { ...} 有什么作用?

我知道 C++ 中的静态变量,但那是静态块还是什么?

这玩意什么时候执行?