zoukankan      html  css  js  c++  java
  • Java技巧之双括弧初始化

      在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述Java技巧之双括弧初始化,更多Java专业知识,广州疯狂java培训为你讲解;

      由于Java语言的集合框架中(collections, 如list, map, set等)没有提供任何简便的语法结构,这使得在建立常量集合时的工作非常繁索。每次建立时我们都要做:

      定义一个临时的集合类变量

      建立一个空集合的实例,然后赋值给变量

      将数据放入集合中

      最后将集合做为参数传递给方法

      例如,要将一个Set变量传给一个方法:

      Java代码

      Set validCodes = new HashSet();

      validCodes.add("XZ13s");

      validCodes.add("AB21/X");

      validCodes.add("YYLEX");

      validCodes.add("AR2D");

      removeProductsWithCodeIn(validCodes);

      也可以用静态初始的方法

      Java代码

      private static final Set validCodes = new HashSet();

      static {

      validCodes.add("XZ13s");

      validCodes.add("AB21/X");

      validCodes.add("YYLEX");

      validCodes.add("AR2D");

      }

      private static final Set validCodes = new HashSet();

      static {

      validCodes.add("XZ13s");

      validCodes.add("AB21/X");

      validCodes.add("YYLEX");

      validCodes.add("AR2D");

      }

      其实,还有简结的方法,我们可以用双括弧语法(double-brace syntax)建立并初始化一个新的集合:

      Java代码

      private static final Set VALID_CODES = new HashSet() {{

      add("XZ13s");

      add("AB21/X");

      add("YYLEX");

      add("AR2D");

      }};

      private static final Set VALID_CODES = new HashSet() {{

      add("XZ13s");

      add("AB21/X");

      add("YYLEX");

      add("AR2D");

      }};

      或者

      Java代码

      removeProductsWithCodeIn(new HashSet() {{

      add("XZ13s");

      add("AB21/X");

      add("YYLEX");

      add("AR5E");

      }});

      removeProductsWithCodeIn(new HashSet() {{

      add("XZ13s");

      add("AB21/X");

      add("YYLEX");

      add("AR5E");

      }});

      第一层括弧 实际是定义了一个内部匿名类 (Anonymous Inner Class),第二层括弧 实际上是一个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执行。这个块之所以被叫做“实例初始化块”是因为它们被定义在了一个类的实例范围内。这和“静态初始化块 (static initialzer)”不同,因为这种块在定义时在括弧前使用了static关键字,因此它的和类在同一个范围内的,也就是说当类加载时就会被执行。

      实例初始化块中可以使用其容器范围内的所有方法及变量,但特别需要注意的是实例初始化块是在构造器之前运行的。

      这种方法只适用于不是final的类,因为final类是无法建立内部匿名子类,好在集合类都没有这个限制。因此,这种方法还可以被用来初始化其它任何对象,比如一个GUI对象:

      Java代码

      add(new JPanel() {{

      setLayout(...);

      setBorder(...);

      add(new JLabel(...));

      add(new JSpinner(...));

      }});

      add(new JPanel() {{

      setLayout(...);

      setBorder(...);

      add(new JLabel(...));

      add(new JSpinner(...));

      }});

      这样建立的内部匿名类的实例中包函它容器对像的引用。如果串行化(serialization)这个集合同时也会串行化它的内部类。

      疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。技术知识沉淀深厚的老师,让你感受Java的魅力,激发你对于编程的热爱,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,成为真正的技术高手;通过大量全真企业项目疯狂训练,迅速积累项目经验。让你成为技能型的现代化高端人才,迅速获得高薪就业!时间不等人,赶紧联系我们吧!疯狂java培训中心地址:广州天河区车陂沣宏大厦3楼。

  • 相关阅读:
    Session的使用与Session的生命周期
    Long-Polling, Websockets, SSE(Server-Sent Event), WebRTC 之间的区别与使用
    十九、详述 IntelliJ IDEA 之 添加 jar 包
    十八、IntelliJ IDEA 常用快捷键 之 Windows 版
    十七、IntelliJ IDEA 中的 Maven 项目初体验及搭建 Spring MVC 框架
    十六、详述 IntelliJ IDEA 创建 Maven 项目及设置 java 源目录的方法
    十五、详述 IntelliJ IDEA 插件的安装及使用方法
    十四、详述 IntelliJ IDEA 提交代码前的 Code Analysis 机制
    十三、IntelliJ IDEA 中的版本控制介绍(下)
    十二、IntelliJ IDEA 中的版本控制介绍(中)
  • 原文地址:https://www.cnblogs.com/gojava/p/3289002.html
Copyright © 2011-2022 走看看