📜  Java中的双大括号初始化

📅  最后修改于: 2022-05-13 01:54:18.387000             🧑  作者: Mango

Java中的双大括号初始化

Java中两个独立进程的组合称为Java中的双大括号初始化。顾名思义,其中包含两个大括号 {{。

一个大括号 { 对于程序员来说并不是什么新鲜事。双大括号初始化中的第一个大括号用于创建匿名内部类。我们以这种方式制作了许多匿名内部类。第二个大括号使它与Java中的普通大括号不同。第二个大括号是与声明的匿名内部类一起使用的初始化块。当这个初始化块与匿名内部类一起使用时,它被称为Java双括号初始化。

双大括号初始化的优点

  • 与原生的创建和初始化方式相比,它的代码行数更少。
  • 代码更具可读性。
  • 创建和初始化在同一个表达式中完成。

双大括号初始化的缺点

  • 它是晦涩难懂的,并不是一种广为人知的初始化方式。
  • 每次我们使用它时,它都会创建一个额外的类。
  • 它不支持使用“菱形运算符” Java 7 中引入的一个特性。
  • 如果我们试图扩展的类被标记为final,它就不起作用了。
  • 它包含对封闭实例的隐藏引用,这可能会导致内存泄漏。

执行:

极客,如果你不知道 双括号初始化您已经在使用没有双括号初始化的标准方法,我们在下面提出了一个示例,如下所示:

过程:当我们在代码中使用集合时,我们通常会执行以下操作。

  1. 为临时集合声明一个变量。
  2. 创建一个新的空集合并将对它的引用存储在变量中。
  3. 把东西放进收藏夹。
  4. 将集合传递给方法。

示例:标准方法

Java
// Java program to Demonstrate Working of Collections
// Without Double Brace Initialization
 
// Importing required classes
import java.util.HashSet;
import java.util.Set;
 
// Main class
// DoubleBrace
public class GFG {
 
    // Method 1
    // Main driver method
    public static void main(String[] args)
    {
        // Creating an empty HashSet of string entries
        Set sets = new HashSet();
 
        // Adding elements to Set
        // using add() method
        sets.add("one");
        sets.add("two");
        sets.add("three");
 
        // Calling method 2 inside main() method
        // Now pass above collection as parameter to method
        useInSomeMethod(sets);
    }
 
    // Method 2
    // Helper method
    private static void useInSomeMethod(Set sets)
    {
        // Print all elements of desired Set
        // where method is invoked
        System.out.println(sets);
    }
}


Java
// Java program to Demonstrate Working of Collections
// With Double Brace Initialization
 
// Importing required classes
import java.util.HashSet;
import java.util.Set;
 
// Main class
// DoubleBrace
public class GFG {
 
    // Main driver method
    public static void main(String[] args)
    {
 
        // Creating an empty HashSet
        Set sets = new HashSet()
 
        // Double brace
        {
            {
                // Adding elements to above HashSet
                // This is double brace initialization
                add("one");
                add("two");
                add("three");
            }
        };
 
        // ...
        // Now pass above collection as parameter to method
        // Calling method 2 inside main() method
        useInSomeMethod(sets);
    }
 
    // Method 2
    private static void useInSomeMethod(Set sets)
    {
 
        // Print elements of the desired Set
        // where method is invoked
        System.out.println(sets);
    }
}


输出
[one, two, three]

输出说明:

以上是我们在编码实践中都遵循的正常步骤。你不觉得Java应该有一个更方便的集合(列表、映射、集合等)语法吗?让我们看看另一种简单的方法。这称为双括号初始化。 Java Double Brace Initialization 用于将创建和初始化组合在一条语句中。使用双括号初始化,我们可以初始化集合。

双大括号初始化的使用

过程:当我们在代码中使用双括号初始化时,我们通常会执行以下操作。

  1. 创建一个扩展集合的匿名内部类。
  2. 提供一个实例初始化块,该块调用 add 方法并将元素添加到集合中。
  3. 将集合传递给方法。

例子:

Java

// Java program to Demonstrate Working of Collections
// With Double Brace Initialization
 
// Importing required classes
import java.util.HashSet;
import java.util.Set;
 
// Main class
// DoubleBrace
public class GFG {
 
    // Main driver method
    public static void main(String[] args)
    {
 
        // Creating an empty HashSet
        Set sets = new HashSet()
 
        // Double brace
        {
            {
                // Adding elements to above HashSet
                // This is double brace initialization
                add("one");
                add("two");
                add("three");
            }
        };
 
        // ...
        // Now pass above collection as parameter to method
        // Calling method 2 inside main() method
        useInSomeMethod(sets);
    }
 
    // Method 2
    private static void useInSomeMethod(Set sets)
    {
 
        // Print elements of the desired Set
        // where method is invoked
        System.out.println(sets);
    }
}
输出
[one, two, three]

输出说明:一个大括号创建了一个新的匿名内部类。这些内部类能够访问其父类的行为。因此,在我们的例子中,我们正在创建 HashSet 类的子类,以便这个内部类可以使用 add() 方法。第二个大括号是实例初始化器。每当创建实例时,都会执行实例初始化程序内部的代码。