【问题标题】:What is the purpose of the {} outside of any methods? [duplicate]{} 在任何方法之外的用途是什么? [复制]
【发布时间】:2013-04-25 10:01:21
【问题描述】:

我不小心在所有方法之外做了一对 {} 并且工作了。

public static void main(String[] args) {
    System.out.println("ddd");
}

{
    System.out.println("ttt");
}

当然,如果您运行此代码,结果是“ddd”,并且仅当我创建它的新实例时它才会写入“ttt”。

如果我让它static {System.out.println("ttt");} 它按设计工作,结果是“ttt”然后是“ddd”

这个有什么实际用途吗?为什么有人会在构造函数或没有书面构造函数的情况下使用它?

我的印象是:它似乎有效,但闻起来像是糟糕而奇怪的做法。我说的对吗?

【问题讨论】:

标签: java initialization


【解决方案1】:

{} 定义模块或代码块的范围(如方法、静态块、类等)

每个模块都应该有一个名称,以便与其他模块区分开来。

在您的情况下,简单地输入{} 意味着您正在创建一个代码块而不是命名,因此它会给出错误。但是将{} 放在一个方法中就可以了。

但是当你把 static 关键字放在它前面时,你正在制作一个在 java 中具有特殊含义的静态块。这意味着 static 块内的所有内容将在您的类第一次加载时执行。

See this link for initializer blocks from Java Tutorials website

【讨论】:

    【解决方案2】:

    这个有实际用途吗?

    有一个使用实例初始化块的“习惯用法”:

     Map mymap = new HashMap() {{put("a", 1); put("b", 2);}};
    

    这是创建使用给定条目集初始化的映射的简洁方法。当你分解它时,它会声明和实例化HashMap 的匿名子类,它使用实例初始化块来填充新映射。


    我的印象是:它似乎有效,但闻起来像是糟糕而奇怪的做法。

    这是一个主观的陈述。对于初始化程序块不好/奇怪,我能想到的唯一合理的论点是人们不使用它们。这个论点带有循环逻辑的味道。

    【讨论】:

    • 我同意,如果每个人都习惯了它就不会真的很臭。但是我觉得它很臭的原因是如果你创建一个私有方法并在构造函数中调用它,代码会更加清晰。当您查看一些代码并且它远离构造函数时,您可能会错过这个 {}。至少我第一次不会怀疑在构造函数之外调用了某些东西。和明显的静态事物。但我看到了 {{ blahblah }} 的实际用途
    【解决方案3】:

    都是关于Initializer blocks

    实例变量的初始化块看起来就像静态初始化块,但没有 static 关键字:

    {

    // will execute when intialization
    

    }

    Java 编译器将初始化程序块复制到每个构造函数中。因此,这种方法可以用来在多个构造函数之间共享一个代码块。

    【讨论】:

    • 是的,我刚刚尝试过,但有没有什么好的做法。例如,你会把它用于任何事情吗?如果它太花哨,我会使用构造函数并使用私有方法。
    • @CsBalazsHungary 看到更新的答案。让我知道还有什么挥之不去的。
    【解决方案4】:

    这些被称为初始化块。它们与所有构造函数一起被调用。所以任何构造函数调用都会调用这段代码。

    只有在加载类时才会调用静态块。

    【讨论】:

      【解决方案5】:

      通常,您必须将初始化实例变量的代码放在构造函数中。使用构造函数初始化实例变量有两种选择:initializer blocksfinal methods

      实例变量的初始化块看起来就像静态初始化块,但没有 static 关键字:

      Java compiler 将初始化块复制到每个构造函数中。因此,这种方法可以用来在多个构造函数之间共享一个代码块。

      来源:here

      【讨论】:

        【解决方案6】:

        它可能不熟悉,但它本身并不坏。它是在构造时执行的初始化程序块。请参阅here 以获得更详细的说明,其中还包括静态初始化块。

        【讨论】:

          【解决方案7】:

          这在java中称为初始化块

          初始化块是大括号之间的代码块,在创建类的对象之前执行。由于初始化块的执行依赖于对象的创建,我们可以很容易地猜测它有两种类型的对象。

          这主要用于初始化你的类中的一些东西,如果你使用任何构造函数,你每次都想要初始化这些东西。

          例如:假设您的类中有 3 个构造函数。
          第一个一个初始化 IO。
          第二个一个初始化套接字等。
          并且您想为您的类初始化一些实例变量,无论您使用哪个构造函数。因此,为此您有 2 个解决方案:

          1. 将初始化代码放入每个构造函数中。
          2. 使用初始化块并将这些变量放入其中,每次调用任何构造函数时都会初始化这些变量。

          【讨论】:

          • 3.制作一个私有方法并在那里做事。好像有一些比较正常的解决方案,可以看出来叫法,不过是主观的观点。
          猜你喜欢
          • 2012-04-09
          • 1970-01-01
          • 2020-09-07
          • 1970-01-01
          • 2017-10-01
          • 2018-04-24
          • 2015-08-07
          • 1970-01-01
          • 2018-01-12
          相关资源
          最近更新 更多