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

Java 我朋友说我的方法没用,有人能解释一下原因吗?,java,oop,hashmap,wrapper,utilities,Java,Oop,Hashmap,Wrapper,Utilities,我最近把我的源代码给了我的朋友,这样他就可以检查一下,告诉我我是否有任何重大错误,比如内存泄漏、其他线程中使用的非线程安全方法等 他看到了我的HashmapWrapper类,告诉我这是一个高效的、无用的、浪费空间的类。我真的很想知道为什么会这样,以及他所说的是否属实 HashmapWrapper类: public class HashmapWrapper<K, V> { public HashMap<K, V> wrapped; public HashM

我最近把我的源代码给了我的朋友,这样他就可以检查一下,告诉我我是否有任何重大错误,比如内存泄漏、其他
线程中使用的非线程安全方法等

他看到了我的
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
{
公共HashMap包装;
公共HashMapWrapper()
{
this.wrapped=newhashmap();
}
公共HashmapWrapper put(K键,V值)
{
this.wrapped.put(键、值);
把这个包回去;
}
公共HashMap get()
{
把这个包回去;
}
}
这是一个非常简单的类,它只用于压缩我制作hashmaps的代码,然后将值放入其中

以下是我使用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());
settings.save(新建HashmapWrapper().put(“volume”,this.volume.getString()).put(“res”,this.screen.resolution.getString()).put(“music”,this.soundSystem.isMusicAllowed().getString()).put(“font”,this.font.getFontName()).get());
set(newhashmapwrapper().put(“coord.x”,this.entity.xCoord).put(“,this.entity.yCoord).get());

我不会说它没用——它确实为初始化映射提供了方便的语法——但如果您只是想在初始化时保存一些键入内容,另一种实现方法是使用,如下所示:

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());
}});
settings.save(新建HashMap()){{
put(“volume”,this.volume.getString());
put(“res”,this.screen.resolution.getString());
put(“music”,this.soundSystem.isMusicAllowed().getString());
put(“font”,this.font.getFontName()).get();
}});

这样做的好处是,您仍然在处理
Map
的子类,而不是自定义类。

我理解您的想法;您希望使方法链接成为可能。但我要问你一件事。什么更容易阅读

Map<String, String> myHashMap = new HashMap<String, String>();

myHashMap.put("This", "Is");
myHashMap.put("Some", "text");
看起来我正在用我刚刚投入的价值做一些事情,不是吗?Java有一个约定和标准化的语法,很多时候不包括与本机
Java
对象的方法链接。最好还是坚持传统,因为下一个人会说

什么在跳舞?!当他们想知道为什么您的
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", "!");

啊,可读。唉,你完全没有节省空间,你又回到了原点!方法链接对于许多不同的应用程序来说都很好,但是当它变得越来越长时,它就会变得模糊

您的朋友之所以说该类没有用,是因为您的包装器没有向hashmap添加任何实质性的新功能。您的put方法添加的唯一一件事是能够链接put(k,v)命令,这不符合正常的java风格。链接命令往往会降低代码的可读性,更难调试/维护

如果希望能够在一行中将多个键值对放入hashmap,更好的方法是创建一个方法。类似的东西

公共void put(Hashmap映射,k[]键,v[]值){
如果(k.size()!=v.size()){
//抛出错误
}否则{
对于(int i=0;i


显然,您可以调整该方法获取参数的方式。二维数组将是另一种选择,或者如果您不需要经常这样做,也可以只使用hashmap put方法。最终这取决于您。

您的朋友是对的!它在现有hashmap的基础上提供了更多功能吗?如果是这样,为什么不使用Hashm呢ap?这个问题似乎离题了,因为它是关于代码检查的。我看到的唯一值是
put()
方法返回HashMapWrapped而不是给定的值,这允许您使用字符串
put()如果你想做的就是用FLUENT /Builder语法定义<代码> map <代码>,请考虑谷歌Guava的<代码> IMPATABLAMAP.Builder()/<代码>和/或<代码> IMPATABLAMAP。
methods。一个缺点是,您正在创建一个单独的类来初始化单个对象。@resueman同意,如果您自由地使用此技术,您将导致编译器生成的类数量激增。此外,必须维护您的代码的人很可能不知道它的含义。更不用说它具有隐含意义感谢你的回复,我会坚持使用一个简单的Hashmap,我想使用链接的唯一原因是,我不需要让我的代码有更多的行,而它可能只有一行:)嗯…让我给你一个编辑。另一件事,这段代码永远不会给任何人和其他人它只会被用于私人用途,如果它是在公共程序中,源代码可能不会被发布。然后,如果源代码被发布,我肯定会添加一些文档,这样下一个家伙就不会认为这是什么?
事实上,构建器模式被认为非常有用,并且只是因为原始的jdk API没有
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", "!");