Java Double Brace初始化

Java双括号初始化被称为在单个步骤中创建和初始化对象,这通常是分多个步骤完成的。它们使用双大括号完成

1.创建和初始化不带大括号的对象

您是否认为Java应该具有更方便的集合语法(列表,地图,集合等)。我之所以这样说,是因为每次如果我们必须在代码中使用集合,那么我们就必须执行以下操作-

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

例如:

没有DoubleBrace.java
import java.util.HashSet;
import java.util.Set;
public class WithoutDoubleBrace
{
    public static void main(String[] args)
{
        Set<String> params = new HashSet<String>();
        params.add("param one");
        params.add("param two");
        params.add("param three");
        params.add("param four");
        // ... and so on; Now pass above collection as parameter to method or
        // some other ways
        useParamsInSomeMethod(params);
    }
    private static void useParamsInSomeMethod(Set<String> params) {
        // TODO Auto-generated method stub
    }
}

这些都是我们在实时编码实践中遵循的正常步骤。

2.双括号初始化以“单个步骤”创建和初始化对象

让我们看看另一种简单的方法。这被称为双括号初始化。使用双括号功能的语法如下:

DoubleBrace.java
import java.util.HashSet;
import java.util.Set;
public class DoubleBrace
{
    public static void main(String[] args)
    {
        Set<String> params = new HashSet<String>() {
            {
                add("param one");
                add("param two");
                add("param three");
                add("param four");
            }
        };
        // ... and so on; Now pass above collection as parameter to method or
        // some other ways
        useParamsInSomeMethod(params);
    }
    private static void useParamsInSomeMethod(Set<String> params) {
        // TODO Auto-generated method stub
    }
}

2.1。内联双括号初始化

或更简单点:

import java.util.HashSet;
public class DoubleBrace {
    public static void main(String[] args) {
        useParamsInSomeMethod(new HashSet<String>() {
            {
                add("param one");
                add("param two");
                add("param three");
                add("param four");
            }
        });
    }
    private static void useParamsInSomeMethod(HashSet<String> params) {
        //perform some operation
    }
}

3.双括号初始化如何工作?

让我们了解它是如何工作的。第一个括号创建一个新的匿名内部类。这些内部类能够访问其父类的行为。因此,在本例中,我们实际上是在创建类的子HashSet类,因此此内部类能够使用add()方法。

第二组括号都不过是实例初始化。如果您想起核心Java概念,那么由于类似struct之类的括号,您可以轻松地将实例初始值设定项块与静态初始值设定项相关联。唯一的区别是,静态初始化程序与static关键字一起添加,并且只能运行一次;无论您创建多少个对象。

4.总结

  1. 由于用双花括号初始化的基本上是内部类。因此,我们可以为所有其他类创建它们,直到没有创建为止final
  2. 在未显式修改equals()方法以使用它们的情况下,不应使用此类,因为大多数equals()方法还会检查类是否相等。
  3. 您应始终牢记,初始化程序在构造函数之前运行(而不是在超类构造函数之前)。
  4. 您创建的匿名类的实例包含对封闭对象的综合引用。如果序列化集合,您还将序列化外部类中的所有内容。

5. Java 9工厂方法

Java 9带来了许多工厂方法,可用于在单个语句中创建和初始化Java集合。如果您使用的是Java 9或更高版本,它可以是一种替代的首选方法。它消除了双括号初始化的必要。

List<String> names = List.of("lokesh", "rohit", "alex");
Set<String> names = Set.of("Lokesh", "Amit", "John");
Map<String, String> names = Map.ofEntries(
                                Map.entry("1", "Lokesh"),
                                Map.entry("2", "Amit"),
                                Map.entry("3", "Brian"));

6. Java 8 Stream 收集器

对于Java 8及更低版本,您可以找到Java Stream 形式的类似用例。

Set<String> names = Stream.of("lokesh", "rohit", "alex")
                    .collect( collectingAndThen( toSet(), Collections::unmodifiableSet ) );

学习愉快!

saigon has written 1440 articles

Leave a Reply