How do I fix these double braces
你好,我正在整理一些代码,我偶然发现了一些双括号。我意识到这是一种罪恶,我应该改正它。但是,我不知道从哪里开始。有人能帮忙吗?
1 2 3 4 5 6 7 8 9 10 | private SelectItem notifyTypeItem = new SelectItem(); notifyTypeItem.setTitle("Default Notification"); notifyTypeItem.setWidth("100%"); notifyTypeItem.setValueMap(new LinkedHashMap<String, String>() {{ put("0","None"); put("1","Subtle"); put("2","Intrusive"); }} ); |
为了理解如何修复它,您应该首先了解它在做什么。为此,您需要了解两件事:
如何修复它的tl;dr只是将那些
1 2 3 4 5 |
请继续阅读,了解正在发生的事情以及为什么这可能是一种糟糕的方法。
匿名子类匿名类通常只是一个没有名称的类。例如,您可以创建接口的匿名实例,如
1 2 3 4 5 6 7 |
号
同样,您也可以创建抽象类和具体类的匿名实例。例如,创建
1 2 3 4 5 6 7 | private static ThreadLocal<SimpleDateFormat> localIsoDateFormat = new ThreadLocal<SimpleDateFormat>() { @Override protected SimpleDateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd"); } } |
当您不需要一个完整的专用类来重写一两个方法时,这非常有用,类似于只使用一个方法创建接口的匿名实例。
实例初始值设定项块实例初始值设定项块允许您在构造函数之外执行初始值设定项。例如:
1 2 3 4 5 6 7 8 9 |
。
它本质上是一个构造函数的代替品,通常是不必要的,所以您很少看到它。它几乎总是可以移动到构造函数。
组合它们您的示例结合了它们。它正在创建
1 2 3 4 5 6 7 | Map<String, String> map = new LinkedHashMap<>() { { put("0","None"); put("1","Subtle"); put("2","Intrusive"); } }; |
它是
出于同样的原因,您需要小心创建匿名类:对封闭类实例的引用。
匿名类因是应用程序内存泄漏的源而臭名昭著。您的代码似乎位于非
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class MyClass { private SelectItem notifyTypeItem = new SelectItem(); public void foo() { notifyTypeItem.setTitle("Default Notification"); notifyTypeItem.setWidth("100%"); notifyTypeItem.setValueMap(new LinkedHashMap<String, String>() {{ put("0","None"); put("1","Subtle"); put("2","Intrusive"); }} ); } } |
。
新创建的
以下是一些相关链接:
- 匿名类Java TRAIL(Java TRAIL,DOCS.Oracle .com)
- 初始化字段Java TRAIL(Java TRAIL,DOCS.Oracle .com)
- Java中双括号初始化是什么?(所以问题,stackoverflow.com)
- 为什么不应该使用双括号初始值设定项(nish-tahir的blog post,blog.nishtahir.com)
- 什么时候使用(匿名)内部类才是安全的?(所以问题,stackoverflow.com)