永远不要跟别人比幸运,我从来没想过我比别人幸运,我也许比他们更有毅力,在最困难的时候,他们熬不住了,我可以多熬一秒钟、两秒钟,甚至更久。

Java使用双括弧初始化操作技巧

Java 新民 220℃ 已收录 0评论

在闲暇之余,偶然看到一种另一种写法,使用{{}}可以简化java中一些代码;翻看了好多资料,最后自己写了个小栗子记录下来:

	package test;

	import java.util.ArrayList;
	import java.util.Collection;
	import java.util.List;

	public class test {
		
		public static void get(Collection<?> collection) {
			for (Object object : collection) {
				System.out.println(object.toString());
			}
		}
		
		public static void get(person per) {
			System.out.println(per.toString());
		}
		
		@SuppressWarnings("serial")
		public static void main(String[] args) {
	// 这种也是可以的		
	//		get(new ArrayList() {{
	//			add("1");
	//			add("2");
	//			add("3");
	//			add("4");
	//		}});
			
			 List list  = new ArrayList() {{
				add("1");add("a");add("b");add("c");add("d1");
			}};
			get(list);
			
			// 这种也是可以的
	//		person person = new person() {{setName("张三");setAge(1111);}};
	//		get(person);
			
			get(new person() {{setName("张三");setAge(1111);}});
		}
	}

	 class person{
		private int age ;
		
		private String name;

		public int getAge() {
			return age;
		}

		public void setAge(int age) {
			this.age = age;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		@Override
		public String toString() {
			return "person [age=" + age + ", name=" + name + "]";
		}
	}

第一层括弧 实际是定义了一个内部匿名类 (Anonymous Inner Class),第二层括弧 实际上是一个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执行。这个块之所以被叫做“实例初始化块”是因为它们被定义在了一个类的实例范围内。这和“静态初始化块 (static initialzer)”不同,因为这种块在定义时在括弧前使用了static关键字,因此它的和类在同一个范围内的,也就是说当类加载时就会被执行(更详情,可参考Java语言规范http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.6 )。实例初始化块中可以使用其容器范围内的所有方法及变量,但特别需要注意的是实例初始化块是在构造器之前运行的。

这种方法只适用于不是final的类,因为final类是无法建立内部匿名子类,好在集合类都没有这个限制。

通过以上介绍,是不是能简化一些代码的编写呢?

本站文章如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:http://www.snowruin.com/?p=1723
喜欢 (1)or分享 (0)
发表我的评论
取消评论
表情 代码 贴图 加粗 链接 私信 删除线 签到

Hi,请填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址