我最近把我的源代码发给了我的朋友,所以他可以查看它并告诉我是否有任何重大错误,如内存泄漏,其他Threads
中使用的非线程安全方法等... < / p>
他看到我的HashmapWrapper
课,告诉我这是无效的,无用的,浪费空间。我真的很想知道为什么会这样,如果他说的是真的。
HashmapWrapper
类:
public class HashmapWrapper<K, V>
{
public HashMap<K, V> wrapped;
public HashMapWrapper()
{
this.wrapped = new HashMap<K, V>();
}
public HashmapWrapper<K, V> put(K key, V value)
{
this.wrapped.put(key, value);
return this.wrapped;
}
public HashMap<K, V> get()
{
return this.wrapped;
}
}
这是一个非常简单的类,它只用于压缩我制作哈希映射的任何代码,然后将值放到它们。
以下是我使用HashmapWrapper的一些示例:
settings.save(new HashmapWrapper<String, String>().put("volume", this.volume.getString()).put("res", this.screen.resolution.getString()).put("music", this.soundSystem.isMusicAllowed().getString()).put("font", this.font.getFontName()).get());
set(new HashmapWrapper<String, Integer>().put("coord.x", this.entity.xCoord).put("", this.entity.yCoord).get());
答案 0 :(得分:3)
我不会说它没用 - 它确实为初始化地图提供了方便的语法 - 但如果您只是想在初始化时保存一些打字,另一种方法是实现你想要的是使用double brace initialization,它看起来像这样:
settings.save(new HashMap<String, String>() {{
put("volume", this.volume.getString());
put("res", this.screen.resolution.getString());
put("music", this.soundSystem.isMusicAllowed().getString());
put("font", this.font.getFontName()).get());
}});
这样做的一个好处是你仍然在处理Map
的子类而不是自定义类。
答案 1 :(得分:1)
我理解你的想法;你想使方法链可能。但是,让我问你一件事。什么更容易阅读?
Map<String, String> myHashMap = new HashMap<String, String>();
myHashMap.put("This", "Is");
myHashMap.put("Some", "text");
立即,我们知道这是做什么的。您要为HashMap
添加两个新条目。
myHashMap.put("This", "is").put("Some", "text");
看起来我正在用我刚刚放入的价值做某事,不是吗? Java具有约定和标准化语法,并且很多时候不包括使用本机Java
对象的方法链接。最好坚持惯例,因为下一个人会说...
跳舞时f @!k是什么?,当他们试图想知道为什么你的HashMap
实现方法链接时。惯例不仅是为了让您的代码更加流畅;它可以让下一个人更容易理解他们正在查看的代码。
修改强>
通常情况下,如果您有一长串代码,通常会将其划分为多行,以便于阅读。一个很好的例子就是当你执行SQL时:
db.executeQuery("SELECT * FROM TABLE WHERE ID IN (SELECT ID FROM OTHERTABLE WHERE ID = ?");
有点长,所以让我们稍微格式化一下。
db.executeQuery("SELECT *
FROM TABLE
WHERE ID IN (
SELECT ID
FROM OTHERTABLE
WHERE ID = ?");
很明显,你有一个嵌套的SQL查询。好吧,让我们对你的代码采用同样的想法。
myMap.put("Hello", "there").put("my", "friend").put("this", "is").put("a", "really").put("long", "hashmap").put("entry", "and").put("gee", "this").put("line", "is").put("long", "!");
那么,你做什么的?哦,是的,把它分成不同的行。
myMap.put("Hello", "there")
.put("my", "friend")
.put("this", "is")
.put("a", "really")
.put("long", "hashmap")
.put("entry", "and")
.put("gee", "this")
.put("line", "is")
.put("long", "!");
啊,可读。唉,你已经完全没有保存空间而且你又回到了原点!方法链接适用于许多不同的应用程序,但是当它变得越来越长时,它就会变得模糊不清。
答案 2 :(得分:-1)
你朋友说这个课没用的原因是因为你的包装器没有为hashmap添加任何实质性的新功能。 put方法唯一添加的是链接put(k,v)命令的能力,这些命令不遵循普通的java风格。链接命令往往会降低代码的可读性,并且难以调试/维护。
如果您希望能够在一行中将多个键值对放入哈希映射中,则更好的方法是创建方法。类似的东西。
public void put(Hashmap<k,v> map, k[] keys, v[] values){
if (k.size() != v.size()){
//throw error
} else {
for(int i = 0; i < k.size(); i++){
map.put(k[i], v[i]);
}
显然你可以调整方法接受参数的方式。二维数组将是另一种选择,或者只是使用hashmap put方法,如果你不经常这样做。最终,它取决于你。