问题标签 [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.
java - 静态初始化器在定义之前不能引用字段
我有以下代码,错误注释
我对使用静态初始化器相当陌生,但我不知道为什么它不会编译。我浏览了有关此主题的一些帖子,并看到了初始化运行的顺序,但这似乎并没有违反规则。当 b 被初始化时, a 应该已经被初始化了。
我有一个解决方法,就是将这个类设置为单例,但这样做会使代码的可读性降低。我很想知道这里出了什么问题。
c# - 具有(和不具有)混合静态构造函数的 C# 静态初始化器
我已经浏览了 C# Language Spec (v5.0) 的相关部分,但我找不到与我所看到的内容相关的部分。
如果你运行下面的代码,你会看到下面的输出,这是我所期望的:
输出是:
这正是我所期望的输出。特别注意,即使方法 F() 使用参数“Init AU”执行,一旦遇到对 BY 的引用,它也会再次调用(如果您愿意,可以中断),导致 B 的静态初始化程序执行。一旦 B 的静态构造函数完成,我们再次返回到 F() 的 AU 调用,这说明 BY 设置为 6,然后设置为 2。所以,希望这个输出对每个人都有意义。
这是我不理解的:如果您注释掉 B 的静态构造函数,这是您看到的输出:
C# 规范 (v5.0) 的第 10.5.5.1 和 10.12 节指示 A 的静态构造函数(及其静态初始化程序)在“引用类的任何静态成员”时触发执行。然而,这里我们从 F() 中引用了 AX,并且没有触发 A 的静态构造函数(因为它的静态初始化程序没有运行)。
由于 A 有一个静态构造函数,我希望这些初始化程序运行(并中断)对 F() 的“Init BR”调用,就像 B 的静态构造函数在我展示的“Init AU”调用中中断 A 对 F() 的调用一样一开始。
谁能解释一下?从表面上看,它看起来违反了规范,除非规范的其他部分允许这样做。
谢谢
java - 在静态初始化器内的静态初始化器之外声明的类型变量
谁能举一个具体的例子来说明 JLS(第 8.7 节)中的以下文本是什么意思?
如果 [...] 在静态初始化程序之外声明的任何类型变量出现在静态初始化程序内的任何位置,则会出现编译时错误。
使它成为错误的原因是什么?
c# - 具有嵌套静态对象实例的对象数组的 WebAPI 2 JSON 序列化失败
我需要为新的 PoC 提供带有一些虚假数据的 Web API 服务。这个对象模型非常简单,有 2 个类,其中 class1 有一个嵌套数组 class2。所以我开始构建一个 FakeDataService,我只是在其中硬编码了一些数据。为简洁起见,我省略了很多属性,因此代码重点关注问题的本质:
所以,我的假数据库的“AllData”是一个 Class1 对象数组(本例中只有一个“数组”),Class1 对象有一个字符串属性(prop1)、一个 Class2 对象数组(prop2)和一个字符串属性数组 (prop3),而 Class2 对象只有一个字符串属性 (prop4)。
WebAPI 控制器是最基本的:
但是当我调用 Values 控制器时,结果是:
注意 Class2 对象的序列化如何产生 i:nil=true
经过几个小时的搜索(我的示例数据比这里的这个简单示例大很多),我发现问题的根源在于嵌套对象数组被定义为静态实例。例如。将 FakeDatabase 的初始代码更改为:
现在调用 WebAPI 控制器给了我(正确):
所以唯一的区别是 Class2 对象的数组。这种行为的解释是什么?
.net - 有没有办法自定义默认模块初始化程序?
我正在将现有的 C++ 库编译为 C++/CLI DLL。C++ 库有两个初始化例程,需要调用它们来设置各种查找表。
C++ 库最初使用<mutex>std::once_flag
来std::call_once()
执行查找表的一次性初始化。但是,在 C++/CLI 中,不支持 <mutex> 标头:
使用 /clr 或 /clr:pure 编译时不支持错误 <mutex>
然后我尝试使用std::atomic_flag
<atomic>,但 C++/CLI 也不支持 <atomic> 标头。
看到我在哪里初始化托管 C++/CLI DLL 之后?然后我尝试实现 DllMain(),但遇到了 C++ 库的初始化例程需要调用托管代码的问题。就我而言,我无法将初始化例程编译为非托管代码(使用#pragma unmanaged
)。
然后我尝试了一个模块初始化程序:
但是,这会导致以下形式的 33 个链接器警告:
1>some.obj : 警告 LNK4210: .CRTMP 部分存在;可能有未处理的静态初始化器或终止器
我想我的自定义模块初始化程序正在覆盖编译器生成的模块初始化程序,它可以正确运行所有静态初始化,例如设置全局变量的初始值。
有没有办法自定义编译器生成的模块初始化器或以其他方式安排编译器生成的模块初始化器调用库初始化例程?
java - java静态初始化程序调用了两次
此方法是否有可能触发全名的静态初始化程序?我有两次调用静态初始化程序的问题。当我尝试检查是否使用 isClassLoaded 加载了类并尝试使用该类时,由于构造函数调用了两次,我得到了错误。任何人都知道 Class.forName(fullname, false, Loader.instance().getModClassLoader()) 有什么问题;?
java - JDK 库是否提供 lambda 'invoker' 实用程序类?
我正在寻找用 lambdas 替换对单独的独立静态初始化函数的需求。例如,我想更换这样的东西......
使用调用在类加载时就地定义的 lambda 的东西。请注意,懒惰地调用它不是我的目标。
目前,我创建了一个Initializer
带有静态方法的简单类,该方法接受 a Supplier
,调用它并返回值。
Initializer
班级
然后在另一个班级:
标准 Java 库中是否已经存在一些东西,所以我不需要提供自己的Initializer
类,或者有什么方法可以简单地定义然后就地执行 lambda?
c# - 如何通过 C# 中的反射找到静态类初始化程序?
如何使用反射在 C# 中找到静态类初始化程序?即使GetMembers()
在类的类型上调用似乎也没有提供该信息。
java - 只是在静态初始化程序中抛出异常?
我正在经历一些练习,并且对在静态初始化程序中处理异常感到非常困惑。
网上的共识似乎是:初始化器只能抛出未检查的异常,或者当所有其他构造函数也声明了异常时,才可以抛出已检查的异常。
但是我不明白为什么:
- 为什么初始化程序不能只抛出检查异常?为什么它必须由其他构造函数声明?如果我们不声明异常,会发生什么,就像一步一步一样?
一个答案是“因为无法在您的源代码中处理这些异常”。为什么会这样?人们不能只捕获异常并有意义地处理它吗?为什么 Java 不允许从静态初始化块中抛出已检查的异常?
另一个回应说,如果我们不为构造函数声明异常,将会有一个“没有声明它抛出任何东西的无参数构造函数”。我真的不明白“无参数构造函数”的部分。当初始化器简单地抛出一个检查异常时,为什么会给我们留下一个无参数的构造函数呢? 初始化程序块可以抛出异常吗?
第一个版本的代码可以工作,但第二个版本不行。
/li>
谢谢!
ios - 覆盖 NSMutableUrlRequest 静态初始化程序?
这是我的场景。现在,我的大多数网络调用都需要在发出请求时将 api 密钥插入到标头字段中。所以我想我能做的就是创建一个 NSMutableUrlRequest 类别。覆盖其中一个初始化程序。然后在那个初始化程序中,我可以将 api 键设置为标题字段。所以每次我创建一个 NSMUTABLEURLREQUEST 对象时,我需要的标题字段已经设置好了。如果您在这里查看苹果文档NSMutableUrlRequest,您可以看到该对象有 4 个初始化程序、2 个类和 2 个实例方法。生病列出我的问题
- 为了完成我的任务,我应该重写什么初始化函数?类还是实例?
- 我怎样才能覆盖它?如果它是一个实例或类初始化器?
- 这甚至是一个好方法吗?还是我应该将它子类化并像那样覆盖它?
我的代码已经写了一段时间了,我不想回去将 api 密钥插入每个单独的请求,因为它们有很多。在某种程度上,我认为这是一种更好的方法,因为我只需将 apiKey 设置在一个地方而不是很多地方,这减少了编程错误的可能性。谢谢你的帮助。
PS 即使这不是完成此任务的好方法,有人仍然可以向我展示类初始化程序是如何工作的吗?就像底层代码一样,所以我也可以生成自己的静态类初始化程序。每次我尝试重写类方法时,我都不知道要返回什么类型。
感谢您的帮助