我的朋友说我的方法没用,有人可以解释一下原因吗?

时间:2014-07-11 19:28:45

标签: java oop hashmap wrapper utilities

我最近把我的源代码发给了我的朋友,所以他可以查看它并告诉我是否有任何重大错误,如内存泄漏,其他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());

3 个答案:

答案 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方法,如果你不经常这样做。最终,它取决于你。