Java中的双大括号初始化
Java中两个独立进程的组合称为Java中的双大括号初始化。顾名思义,其中包含两个大括号 {{。
一个大括号 { 对于程序员来说并不是什么新鲜事。双大括号初始化中的第一个大括号用于创建匿名内部类。我们以这种方式制作了许多匿名内部类。第二个大括号使它与Java中的普通大括号不同。第二个大括号是与声明的匿名内部类一起使用的初始化块。当这个初始化块与匿名内部类一起使用时,它被称为Java双括号初始化。
双大括号初始化的优点
- 与原生的创建和初始化方式相比,它的代码行数更少。
- 代码更具可读性。
- 创建和初始化在同一个表达式中完成。
双大括号初始化的缺点
- 它是晦涩难懂的,并不是一种广为人知的初始化方式。
- 每次我们使用它时,它都会创建一个额外的类。
- 它不支持使用“菱形运算符” Java 7 中引入的一个特性。
- 如果我们试图扩展的类被标记为final,它就不起作用了。
- 它包含对封闭实例的隐藏引用,这可能会导致内存泄漏。
Note: It’s due to these disadvantages that double brace initialization is considered as an anti-pattern.
执行:
极客,如果你不知道 双括号初始化您已经在使用没有双括号初始化的标准方法,我们在下面提出了一个示例,如下所示:
过程:当我们在代码中使用集合时,我们通常会执行以下操作。
- 为临时集合声明一个变量。
- 创建一个新的空集合并将对它的引用存储在变量中。
- 把东西放进收藏夹。
- 将集合传递给方法。
示例:标准方法
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 用于将创建和初始化组合在一条语句中。使用双括号初始化,我们可以初始化集合。
双大括号初始化的使用
过程:当我们在代码中使用双括号初始化时,我们通常会执行以下操作。
- 创建一个扩展集合的匿名内部类。
- 提供一个实例初始化块,该块调用 add 方法并将元素添加到集合中。
- 将集合传递给方法。
例子:
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() 方法。第二个大括号是实例初始化器。每当创建实例时,都会执行实例初始化程序内部的代码。