我正在开发我的第一个 Swing 应用程序,现在提出了一个难题:在静态初始化期间或开始实际执行后执行引导和资源初始化。我是什么意思...我有应用程序
单例:
public enum Appliation{
INSTANCE;
private static void initResources(){
//init resources
}
private Application(){
initResources();
}
public void run(){
//display the gui
}
//remainders omitted
}
因此,main
方法如下所示
public static void main(String[] args){
Application app = Application.INSTANCE;
app.run();
}
或者,也许我在启动后手动初始化资源,然后运行它。逻辑上正确的方式是什么?
如果您需要单例,我个人会通过延迟初始化进行,因为您可以在初始化资源时获得异常,这样如果您将其实现为简单的单例
,您可能会在类的静态初始化
期间获得异常,从而导致难以找到错误。
public class Application {
private Application() {
initResources();
}
private void initResources(){
//init resources
}
public static Application getInstance() {
return ApplicationHolder.INSTANCE;
}
public void run(){
//display the gui
}
//remainders omitted
/**
* Static inner class used to lazy initialize the Application, it will
* be loaded only on Application.getInstance() such that if it fails,
* you will easily understand that is while initializing the Application
*/
private static class ApplicationHolder {
private static final Application INSTANCE = new Application();
}
}
那么您的main
方法将如下所示
public static void main(String[] args){
Application app = Application.getInstance();
app.run();
}
如果可能,请避免将应用程序
设置为具有枚举
的单例。如果它是一个普通类,则可以在构造函数中执行初始化。
public static void main(String[] args) {
Application app = new Application();
app.run();
}
这允许main()
控制何时初始化类,这有很多好处。如果初始化速度慢,main()
控制何时以及在什么线程上发生。如果异常是可能的,main()
可以捕获它们main()
还可以设置线程默认异常处理程序,配置日志记录,或执行其他应该在Application
初始化之前执行的启动任务。
问题内容: 这是一段Java代码: 它如何编译?初始化后已执行变量“ ture”的声明。据我所知,静态块和字段已经按照它们出现的顺序执行了。 现在,为什么实例块中的值9已被打印3次?顺便说一句,该类的实例已创建了3次。那不是功课,我正在学习Java进行认证。 问题答案: 关于第一个问题,静态块确实按照它们出现的顺序进行处理,但是在处理静态块之前,先处理声明。声明作为类 准备工作 的一部分(JLS§
问题内容: 如标题所示,两者之间到底有什么区别 和 除了结构以外,还有什么重要区别吗? 问题答案: 对于您的示例,没有区别。但是如您所见, 只能接受一个表达式来初始化变量。但是,在静态初始化器(JLS 8.7)中,可以执行任意数量的语句。例如,可以这样做: 对于您的示例,显然不需要这样做,但是变量的初始化可能不仅仅使用表达式,甚至可能包含许多语句,因此Java制作了静态初始化器。
问题内容: 我想知道为什么默认情况下C,C ++和Java中的确切静态变量初始化为零?为什么对局部变量不是这样? 问题答案: 为什么要对静态变量进行确定性初始化而对局部变量不进行初始化? 了解如何实现静态变量。 它们的内存在链接时分配,并且它们的初始值也在链接时提供。 没有运行时开销。 另一方面,用于局部变量的内存是在运行时分配的。堆栈必须增长。你不知道以前在那里。如果需要,可以清除该内存(将其清
问题内容: 据我了解,“静态初始化块”用于设置静态字段的值(如果无法在一行中完成的话)。 但是我不明白为什么我们需要为此设置一个特殊的块。例如,我们将字段声明为静态(无值分配)。然后编写几行代码,生成并为上面声明的静态字段分配一个值。 为什么我们需要在这样一个特殊的块这样的行:? 问题答案: 在非静态块: 每次构造类的实例时被调用。在静态块只被调用一次,当类本身初始化,无论该类型的有多少对象创建。
结果将是: 我对这个结果感到困惑,因为根据标准规则,不是静态初始化,是静态初始化,因为这些: 变量或临时对象o的常量初始值设定项是其完全表达式为常量表达式的初始值设定项,但如果o是对象,则这样的初始值设定项也可以为o及其子对象调用constexpr构造函数,即使这些对象是非文字类类型。 如果实体的常量初始值设定项初始化具有静态或线程存储持续时间的变量或临时对象,则执行常量初始化。如果不执行常量初始
问题内容: 这是无效的代码: 这是一个愚蠢的示例,但是在静态类构造函数中,我们不能这样做。为什么?是否有充分的理由呢?有人对此有更多了解吗? 因此,我应该这样做的原因是在那里结束构建。 谢谢 问题答案: 我认为原因是初始化程序与字段初始化(以及实例初始化程序的构造函数)一起携带。换句话说,JVM仅识别一个位置来初始化静态字段,因此所有的初始化(无论是否以块为单位)都必须在此完成。 因此,例如,当您