How to use double brace initialization for Map of Map
我确实理解双括号初始化有其自己的隐藏成本,仍有可能的方法来初始化Map>()。
我尝试了什么:
我知道这是一个不好的做法,但实验我正在尝试。
参考和动机:Arrays.asList也适用于地图?
-
这甚至是合法的Java语法吗?
-
是的:stackoverflow.com/questions/40449848/…
-
@LutzHorn,完成了!
-
建议:尝试尽可能避免使用这种数据结构,以支持具体类。
-
在一个语句中一次向HashMap添加多个条目的可能重复
-
@CommonMan我希望你知道"双括号初始化"集合将始终保持对引用它们的类的强引用。
-
@Naman,这不是我想要的,我正在寻找地图的地图的双括号初始化。
-
双支撑初始化是一种反模式
-
@rkosegi,我在这里读到它stackoverflow.com/questions/1958636/… ,但如果你能用答案中的例子更详细地解释,它会帮助我和其他偶然发现这个问题的人,分享就是关心:)
-
@CommonMan stackoverflow.com/a/1958961/1121249和blog.jooq.org/2014/12/08/…
您可以使用java9中的Map.of()返回不可变映射:
或者Map.ofEntries:
-
喜欢它和+1,但我正在寻找双支架初始化。虽然一如既往地感谢:)
-
在Java 10+甚至更短:var map = Map.of("a", Map.of("c","d"));
-
@Ruslan,我在某地读过Map.of(),只能填充10个项目,对吧?
-
@CommonMan是的,ofEntries解决了这个问题
-
在许多情况下,20个参数的列表足以混淆哪些是键,哪些是值。限制是有充分理由的。 ofEntries几乎无限制的项目,并确实清楚哪些是键,哪些是值。
-
或者,如果您使用来自番石榴的pre-java-8代码:ImmutableMap::of
-
@ OleV.V。好吧,限制的充分理由是你不能声明支持不同键和值类型的varargs方法,因此,只能声明带有显式参数列表的重载方法。这可能与你的想法相一致,无论如何太多的争论都令人困惑,但主要原因纯粹是技术性的。
-
@Holger在我自己开发的库中,我看到了一个接受Object...并返回地图的方法。您可以传递奇数个参数并返回异常,或传递完全错误的类型。如果意志强烈(不用说我的意志不强),可以克服技术限制。
-
@CommonMan如果你可以使用Map.of和朋友,那很好,但如果你不能,你可能最好不要使用自己的实用程序方法而不是使用双括号初始化。
-
@StuartMarks,我可以使用Map.of并一直在使用它,我只是想看看如果我在Map of Map中使用它的东西是如何工作的。
几乎一切都很好,你只需要在双括号中使用方法调用:
1 2 3
| Map <String, Map <String, String >> defaultSourceCode = new HashMap <String, Map <String, String >>(){
{put ("a", new HashMap <String, String >(){{put ("c", "d");}});}
}; |
但是这个答案描述了为什么你不应该这样做。
-
谢谢你,是的,丢失了。
-
有趣的是,Eclipse希望我为这些类定义一个serialVersionUID。
-
这是一个非常着名的反模式!请不要。
-
@Eugene你是绝对正确的,我附上了更多的信息。
-
@LutzHorn,这是与这种反模式相关的问题的一个很好的暗示。这是创建Serializable类的子类,并序列化此类映射将创建对此匿名类的持久引用。当然,添加serialVersionUID并不能解决问题(除此之外你无法做到这一点)。例如,周围类的微小变化,例如再次对不同的地图使用这种反模式,可能导致类文件的重新编号,这使持久地图无效。更不用说对外部对象和任何捕获变量的意外引用......