我正在攻读关于Java的考试.在我学习的时候,我遇到了java中我不熟悉的语法.例如花括号({})取消了没有名称的类主体,有些具有静态关键字.我发现它们被称为"初始化器".任何人都可以帮我指出它们之间的主要差异以及它们与构造函数的区别.谢谢
如何在objective-c中创建静态初始化器(如果我有正确的术语).基本上我想做这样的事情:
static NSString* gTexts[] =
{
@"A string.",
@"Another string.",
}
Run Code Online (Sandbox Code Playgroud)
但是我想要更像struct这样做,即不仅仅为这个数组中的每个元素都有一个NSString,而是一个NSString加一个NSArray,它包含一个可变数量的MyObjectType,其中MyObjectType将包含一个NSString,一对int,等等.
我有理解初始化发生顺序的问题.这是我假设的顺序:
*Once per
1. Static variable declaration
2. Static block
*Once per object
3. variable declaration
4. initialization block
5. constructor
Run Code Online (Sandbox Code Playgroud)
但根据这段代码,我显然是错的:
class SomethingWrongWithMe
{
{
b=0; //no. no error here.
int a = b; //Error: Cannot reference a field before it is defined.
}
int b = 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我这样做,错误就会消失:
class SomethingWrongWithMe
{
int b = 0;
{
b=0;
int a = b; //The error is gone.
}
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么没有错误
b=0;
Run Code Online (Sandbox Code Playgroud) 我使用以下代码.
const int X_ORIGIN = 1233086;
const int Y_ORIGIN = -4728071;
const int Z_ORIGIN = 4085704;
const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};
Run Code Online (Sandbox Code Playgroud)
当我编译它时,GCC给我以下错误.
Transformations.h:16:1:错误:初始化元素不是常量
那是什么意思?我该如何修复我的代码?
令我惊讶的是,使用CreateDatabaseIfNotExists上下文初始化程序,该行
context.Database.Initialize(true)
Run Code Online (Sandbox Code Playgroud)
如果架构与我的代码第一个架构不匹配,则不会抛出异常.
有没有办法验证当前数据库是否与我们的模式匹配,例如,我们尝试访问一个实体,其表不再存在于数据库中,并且EF抛出异常?
令人惊讶的是,Rails的初始化程序在运行任何rake任务时运行,包括db:migrate和db:seed.
我的应用程序中的初始化程序启动后台线程(一种工作进程),它应该仅在应用程序在调试和生产模式下运行时执行.
如何在执行rake db:migrate或如何在初始化程序中检测到rake任务正在运行时阻止特定初始化程序运行?
我有一个方法有一个数组参数,如:
public static void foo(int[] param) {
// Some code
}
Run Code Online (Sandbox Code Playgroud)
而且我也可以通过写作来调用方法
foo(new int[3]);
Run Code Online (Sandbox Code Playgroud)
通常,我们通过new运算符或双括号初始化器(如{1,2,3})声明和初始化数组.例如,int[] foo = new int[3]; 或 int[] foo = {1, 2, 3};.
但是使用双括号初始化器作为方法的参数是不可能的.{}仅适用于创建数组对象.
这是我的问题:新运营商和{}?之间有什么区别吗?如果有,那是什么?
我的神秘面纱就是这样开始的.考虑一下这段代码:
import java.util.Set;
import javax.annotation.processing.*;
import javax.lang.model.element.TypeElement;
@SupportedOptions({
"thing1",
"thing2",
})
public class fc extends AbstractProcessor
{
@Override
public boolean process( Set<? extends TypeElement> anns, RoundEnvironment re)
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你看过大多数脚手架(我只是想确保它完全没有完成并且你可以运行你的编译器),你会看到中间有一个注释,它需要一个String数组初始化器,并且有一个逗号之后"thing2".现在,如果你是那种让Java语言规范在晚上与你同住的人,你会记得最后一个逗号是完全有效的,"可能会出现在数组初始值设定项中的最后一个表达式之后被忽略." 因此,如果您在自己喜欢的地方尝试这个javac,那么它完全编译就不会感到惊讶.
所以这就是谜.上面的示例直接来自真实项目中请求的真实补丁,因为有人在构建该项目时获得了真正的"非法表达式"编译器消息,并在删除最终逗号时离开了.
很明显,那个人正在使用一个braindamaged版本javac,或者在他的工具链中有一些其他的whizbang source munging工具,它没有完全正确的Java语法,虽然他在他的错误报告中提供了其他完整的信息,在这种情况下只有真正重要的信息将是谁的编译器和工具链以及他正在使用的版本,并且他没有提供任何这些!因此,不仅是对不需要它的代码进行了虚假修补,而且没有足够的信息来提交它真正需要的错误报告,工具供应商会在有效的Java上产生虚假错误.
所以,我有点众包这个:) ...任何人都可以找到一个不能成功编译上述代码的Java编译器或其他相关工具,但会标记类似于此示例中报告的错误吗?那么也许我们会知道罪魁祸首是什么.
我只是部分地感到恼怒,因为我的代码被虚假修补了;)...它至少让我感到烦恼,因为可能还有一些尚未修复的工具,并且会让更多的人感到困惑关于什么是Java和什么不是,并导致更多奇怪的补丁代码没问题.
谢谢!
目前我有一些像这样的快速代码:
class C {
let type: Type;
var num = 0;
init() {
self.type = Type({ (num: Int) -> Void in
self.num = num;
});
}
}
Run Code Online (Sandbox Code Playgroud)
Swift编译器拒绝允许它,说我self.type在它初始化之前引用了它,尽管这显然是完全不真实的.此外,我不能使用在其他问题/答案中找到的解决方法,因为type它不是可选的,并且它是不可变的,所以它无法nil首先无意义地初始化.
如何让Swift编译器接受这个完全有效的代码?
这与早期从初始化程序返回无关.回调是异步执行的 - 它被存储然后再使用.
我还有一些let在此之后初始化的s.我必须将它们全部变成可变的选项,即使它们不是可选的并且不能被变异.
我知道这可能是一个基本问题.
我有一个任务,要求我理解c中的指定初始化器是什么以及用一个初始化变量意味着什么.我不熟悉这个词,也找不到任何结论性的定义.
我一直在寻找不同地方的答案,但找不到任何答案.谢谢您的帮助!
initializer ×10
java ×4
arrays ×2
c ×2
constructor ×2
static ×2
block ×1
closures ×1
const ×1
objective-c ×1
parameters ×1
swift ×1
syntax ×1