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

为什么不允许用 import *

  •  
  •   rizon ·
    othorizon · 2020-06-29 11:44:22 +08:00 · 7203 次点击
    这是一个创建于 1606 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Java 语言

    有些公司 有很多各种规定,其中一个代码规范就是不允许使用 import a.b.c.* 这样的。

    这是为什么??

    30 条回复    2020-06-29 20:14:47 +08:00
    kop1989
        1
    kop1989  
       2020-06-29 11:45:20 +08:00
    怕下文使用的时候,用错类?
    sean10
        2
    sean10  
       2020-06-29 11:46:01 +08:00
    命名空间污染?
    如果 2 个模块里有同名方法,那不就 gg 了, 用错出问题的时候, 排查这个很浪费时间
    cheng6563
        3
    cheng6563  
       2020-06-29 11:52:31 +08:00 via Android
    都是 IDE 自动 import 的,他爱 import 啥样就啥样,不管的。
    optional
        4
    optional  
       2020-06-29 11:59:42 +08:00   ❤️ 7
    ide 还好,code review 的时候,谁知道一个类是哪来的?
    optional
        5
    optional  
       2020-06-29 11:59:51 +08:00
    @cheng6563 ide 可以改设置的。
    gsls200808
        6
    gsls200808  
       2020-06-29 12:30:24 +08:00 via iPhone
    IDE 如果把一个包下所有类全导的话也会合并成*的,楼主的提问 提升编译效率,编译同名类冲突。实际上,同名类这种冲突编译期就会报出来了,编译效率提升也不是非常多。
    XanderChen
        7
    XanderChen  
       2020-06-29 13:00:49 +08:00
    想要严格的控制导入的东西呗,用的导,用不到的不导。
    lululau
        8
    lululau  
       2020-06-29 13:14:29 +08:00   ❤️ 1
    我作为一个技术部门小领导,总得整点什么事,好跟我的上司说我都办了哪些事情吧?要不然呢,让我回去写代码吗?
    fatestigma
        9
    fatestigma  
       2020-06-29 13:28:01 +08:00
    import * 真的是写的爽,看代码的时候就很头疼了,根本不知道从哪里来的,还得挨个 OpenGrok 搜,有的方法名还重复率非常高。再遇上 C++的 include 和一堆 use namespace,代码真是没法读了。
    jzmws
        10
    jzmws  
       2020-06-29 14:53:20 +08:00
    一般不会遇到问题 要是遇到问题就是大坑了 . com.aa.xx.User 这个类 , 用* 导入 你其实是要用 com.bb.xx.User 这个类 然后就 gg 了
    jzmws
        11
    jzmws  
       2020-06-29 14:53:46 +08:00
    @jzmws 不过 ide 会自动优化导包也是一个坑
    wujieyuan
        12
    wujieyuan  
       2020-06-29 15:41:30 +08:00   ❤️ 2
    你妈让你叫几个长辈过来吃饭, 你发现几个长辈都是同一个王, 于是你为了省事用大喇叭把全村姓王都叫过来吃饭了
    kop1989
        13
    kop1989  
       2020-06-29 15:43:46 +08:00
    @wujieyuan #12 关键他妈让他向王舅舅敬酒,结果他给王大爷敬了个……😂
    GM
        14
    GM  
       2020-06-29 15:47:41 +08:00
    #4 楼正解。

    其实我还碰到一种情况:

    最近有个小项目使用 C#,C#的 import 和 Java 不一样,它的每个 import 语句都是导入指定命名空间下的所有类,相当于所有 import 都是 import my.namespace.*,结果重构、排除编译错误的就非常恶心。

    有时候需要把某个类从一个子模块移到另一个子模块,然后问题就来了,移动过去后,从代码里根本不知道这个类里引用到的其他类是从哪个命名空间的导入的,进而也就不知道它是属于哪个 dll (相当于 java 里的 jar 包),只能终止重构,恢复源代码回去查看,然后再重新来过。
    MerlinShieh
        15
    MerlinShieh  
       2020-06-29 15:51:00 +08:00
    我这边 Python 规范就是禁止使用 import * 和 from xxx import xxx 。觉得在后面引用时太长了就导入时重命名
    TtTtTtT
        16
    TtTtTtT  
       2020-06-29 16:09:03 +08:00
    糖化语法向来就是这样的,在便捷性和可读性上,不同级别的项目取舍是不一样的。
    Mohanson
        17
    Mohanson  
       2020-06-29 16:11:37 +08:00 via Android
    看 c 代码经常能看到 "我知道我在做什么" 的注释然后强制跳过编译器语法检查的…

    个人看来这些规范,范式可以拿来用,但不必当教条,适合自己的开发习惯就好。
    atonku
        18
    atonku  
       2020-06-29 16:16:34 +08:00
    禁止 public class
    zsdroid
        19
    zsdroid  
       2020-06-29 17:20:06 +08:00
    所以为什么不像 php 那样出个 as
    ```
    import a.b.c.user as cUser;
    import a.b.d.user as dUser;
    ```
    GINLSL
        20
    GINLSL  
       2020-06-29 18:32:25 +08:00
    @GM 以前 VS 的代码提示功能,还只能提示已经 using 进来的命名空间中的类。现在改了全局都能提示,好多了。
    GM
        21
    GM  
       2020-06-29 18:36:05 +08:00
    @GINLSL C# 这东西,好用的地方很好用,不好用的地方也很让人不爽。不强制 namespace 和目录结构一样也是个比较恶心的地方,容易出现不对应,影响阅读源码。
    jim9606
        22
    jim9606  
       2020-06-29 18:52:05 +08:00
    IDE 自动 import 一般都不会出现 import a.b.*这样的。
    不过我觉得 import java.util.*没什么问题
    jeffh
        23
    jeffh  
       2020-06-29 18:55:31 +08:00
    现在都是 ide 自动导入的了,没必要限制这么严格吧
    itskingname
        24
    itskingname  
       2020-06-29 18:56:13 +08:00
    楼主问的是 Java,我写了一篇公众号说明为什么 Python 里面禁止使用 import *

    https://mp.weixin.qq.com/s/bFmCbzgxLjTZWFbleBVrDA
    SilencerL
        25
    SilencerL  
       2020-06-29 19:02:50 +08:00
    @GM #14
    如果你开心的话用 using static 也是可以的...

    using Example = Test.Demo.Example; // Test 是个类
    using AnotherExample = OtherTest.Demo.Example; // 还可以当作别名防止重复类名的困扰
    GM
        26
    GM  
       2020-06-29 19:21:43 +08:00
    @SilencerL 这种需要手动写,每个字母都要自己打,用起来也挺郁闷的,IDE 默认都是给你 using My.Namespace;
    goodboy95
        27
    goodboy95  
       2020-06-29 19:43:53 +08:00
    话说楼上写代码都用 vim 吗?我一般看代码都是 ctrl+alt+b (idea) 或者 F12 (VS / VS code)直接看函数在哪个文件。而且写代码的时候真的很少碰到类名重复的情况,毕竟一个文件就 import 那么多东西,有几次遇见重复的也不至于在写代码过程中看不出来(毕竟里面的变量和方法完全不一样了)
    optional
        28
    optional  
       2020-06-29 19:56:59 +08:00 via iPhone
    @goodboy95 你肯定不 review 代码。。。
    wuketidai
        29
    wuketidai  
       2020-06-29 20:05:00 +08:00
    显式优于隐式
    skypyb
        30
    skypyb  
       2020-06-29 20:14:47 +08:00
    Collectors 类, 你们都不静态导入*的嘛?
    这玩意不静态导入代码会挺丑陋的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1208 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:10 · PVG 07:10 · LAX 15:10 · JFK 18:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.