Java 双括号初始化
Java中两个独立过程的组合被称为Java中的双括号初始化。顾名思义,有两个大括号{{包含在其中。
单大括号{对程序员来说并不新鲜。双大括号初始化中的第一个大括号是用来创建一个匿名内类的。我们已经用这种方式做了很多匿名内类。第二个大括号是它与Java中普通大括号的不同之处。第二个大括号是初始化块,它与声明的匿名内类一起使用。当这个初始化块与匿名内类一起使用时,它被称为Java双括号初始化。
双括号初始化的优点
- 与本地创建和初始化方式相比,它的代码行数更少。
- 代码的可读性更强。
- 创建和初始化是在同一个表达式中完成的。
双括号初始化的劣势
- 晦涩难懂,不是一种广为人知的初始化方式。
- 每次我们使用它都会创建一个额外的类。
- 它不支持使用 “钻石运算符”–在Java 7中引入的一个特性。
- 如果我们试图扩展的类被标记为 final ,它就不起作用 。
- 它持有对包围实例的隐藏引用,这可能导致内存泄漏。
注意 :正是由于这些缺点,双括号初始化被认为是一种反模式。
实现 。
极客们,如果你不知道 双大括号初始化,你已经在使用标准的方法,即没有双大括号初始化,我们在下面提出了一个例子,如下。
过程: 当我们在代码中使用一个集合时,我们通常会做以下工作。
- 声明一个临时集合的变量。
- 创建一个新的空集合,并在变量中存储一个对它的引用。
- 把东西放到集合中。
- 将集合传递给方法。
例子: 标准方法
// 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<String> sets = new HashSet<String>();
// 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<String> sets)
{
// Print all elements of desired Set
// where method is invoked
System.out.println(sets);
}
}
输出
[one, two, three]
输出解释。
以上是我们在编码实践中都会遵循的正常步骤。你不觉得Java应该有一个更方便的集合(列表、Map、集合等)的语法吗?让我们看看另一种简单的方法。这就是所谓的 双括号初始化。 Java双括号初始化是用来将创建和初始化结合在一条语句中的。使用双括号初始化,我们可以初始化集合。
双括号初始化的用法
过程: 当我们在代码中使用双括号初始化时,我们通常会做以下事情。
- 创建一个扩展了集合的匿名内类。
- 提供一个实例初始化块,调用add方法并将元素添加到集合中。
- 将集合传递给方法。
例子
// 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<String> sets = new HashSet<String>()
// 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<String> sets)
{
// Print elements of the desired Set
// where method is invoked
System.out.println(sets);
}
}
输出
[one, two, three]
输出解析: 第一个 括号创建了一个新的匿名内类。这些内类能够访问其父类的行为。因此,在我们的例子中,我们正在创建一个HashSet类的子类,以便这个内类可以使用add()方法。 第二个 大括号是实例初始化器。每当一个实例被创建时,实例初始化器里面的代码就会被执行。