V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lxy
V2EX  ›  Java

最近很烦各种参数初始化

  •  
  •   lxy · 2018-04-02 18:31:37 +08:00 · 3000 次点击
    这是一个创建于 2431 天前的主题,其中的信息可能已经有所发展或是发生改变。

    举个例子

    Map<String, String> sqlParam = new HashMap<String, String>() {{
       put("userId", userId);
       put("roleId", roleId);
       put("password", password);
       // etc ...
    }};
    

    像这种双大括号初始化会产生内部类文件,听说数量多了会影响运行速度。但是不用{{又很麻烦,连续写几次 sqlParam.put 就感觉十分难受。其它语言如 js 有 with,Python、PHP 可以直接 dictName[key]赋值,C#可以连写。

    是使用 Java 姿势不对还是本来就这么麻烦?

    第 1 条附言  ·  2018-04-02 20:50:15 +08:00
    更烦的是,当内部类访问局部变量时,局部变量必须声明为 final (或实际上之后没有改动),所以有时候还不能直接用...
    刚开始写 Java 的时候觉得嗯是个很严谨的语言,现在觉得怎么这么麻烦,唉╮(╯▽╰)╭
    16 条回复    2018-04-03 11:26:00 +08:00
    broadliyn
        1
    broadliyn  
       2018-04-02 19:32:44 +08:00
    奇葩了,写了这么多年还有 lz 这种双花括号的 java 写法????
    难道你的 ide 就去没有报语法错误??
    willvvvvv1
        2
    willvvvvv1  
       2018-04-02 19:36:42 +08:00
    @broadliyn 了解一下再开喷,兄弟。
    lhx2008
        3
    lhx2008  
       2018-04-02 19:37:25 +08:00
    @broadliyn 内部类了解一下,里面的{}是初始化块
    @lxy 感觉如果重载了[]符,又会引出各种各样的问题了,还是单纯的面向对象好点
    broadliyn
        4
    broadliyn  
       2018-04-02 19:37:26 +08:00
    刚看了下,的确还真有这种写法。。https://www.jianshu.com/p/0ed87e80413e
    不太了解,为什么不直接 put ?

    Map<String, String> sqlParam = new HashMap<String, String>();
    map.put("userId", userId);
    map.put("roleId", roleId);
    map.put("password", password);

    还省了一行代码
    whitev2
        5
    whitev2  
       2018-04-02 19:38:54 +08:00
    扔 IDEA 里去试了,还真没有报错
    hcymk2
        6
    hcymk2  
       2018-04-02 19:46:10 +08:00
    试下 java9
    zjp
        7
    zjp  
       2018-04-02 19:50:00 +08:00 via Android
    应该说静态语言都这样吧,而且 Java 类库的方法一般不会返回自身,也不能链式调用了
    FreeEx
        8
    FreeEx  
       2018-04-02 19:52:27 +08:00 via Android
    Java 这点就是很烦,有种简单粗暴的办法就是写 json 反序列化成 map。
    sagaxu
        9
    sagaxu  
       2018-04-02 20:08:33 +08:00 via Android
    java 9 有 Map.of ,但是仍然不如 Kotlin 的 mapOf/mutableMapOf 方便。java 语法没救了,换 kotlin 或者 scala 吧。
    kx5d62Jn1J9MjoXP
        10
    kx5d62Jn1J9MjoXP  
       2018-04-02 20:32:12 +08:00 via Android
    第一次知道有这种写法...
    不过查了一下原来只是匿名内部类和初始化块结合而已...
    yidinghe
        11
    yidinghe  
       2018-04-02 21:03:39 +08:00 via Android
    双括号就是匿名内部类,没什么特别的。用个 Builder 类来创建 Map 也是可行方法,写出来比匿名内部类还简洁些。
    reid2017
        12
    reid2017  
       2018-04-02 21:18:20 +08:00
    我也是第一次看这种写法。不过,实话说,习惯了 Java 这种严谨语法,最近在学习 python go 这类的函数式编程语言,各种不习惯
    searene
        13
    searene  
       2018-04-02 21:24:24 +08:00
    其实你先声明变量再 put 的话也就多了一行而已,写起来不费什么劲,读起来更是毫无压力,纠结这多出的一行根本没有任何意义。读代码的速度和代码的行数没有必然联系。
    narcotics
        14
    narcotics  
       2018-04-02 22:20:43 +08:00
    `ImmutableMap.of` 试试,没记错的话是 Guava 里的一个辅助类
    WildCat
        15
    WildCat  
       2018-04-02 22:35:05 +08:00
    学习了,还有这种学法,白上了一年 20W 的 Java 培训班 🤪
    starmoon1994
        16
    starmoon1994  
       2018-04-03 11:26:00 +08:00
    工厂模式了解一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1437 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:54 · PVG 07:54 · LAX 15:54 · JFK 18:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.