关于Java为什么不推荐使用 import *导包这件小事

这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党

背景

最近在给 apache shardingsphere提代码的时候,有一个比较有意思的规范,就是不允许使用 import *去导入包

import *

在自己开发认知中,其实一直都是使用的import *这玩意去导包的,包括idea的import *默认也是超过5个相同包就给你合并使用import *导入

突然给提了这个规范就打算研究下单个类的导入和import *导入的一个区别。

其实java是有两种中导包机制的

  1. 单类型导入(single-type-import):例如 import java.util.List;
  2. 按需类型导入(type-import-on-demand):例如import java.util.*;

平时我们开发因为idea配置,所以导入相同包下面的类多了基本都会自动转换为按需类型导入(type-import-on-demand),所以其实只要我们使用统一的idea配置也是无感知的。如果团队中所有人都是使用这种方式,你一个人改为单类型导入(single-type-import)方式可能就会经常出现代码冲突。所以单从这点来看我们需要团队有一个统一的开发规范

性能方面

其次在研究过程中我还发现是有一些编译性能差异的,但是不会对运行时的性能产生任何影响
因为Java编译器是按如下顺序寻找类的

  1. 在显示导入的类中
  2. 在包中
  3. 最后再寻找通配符相关的包

就像下面两个例子。虽然

package something; 
import java.util.*; 
  //.... 
Set set = null;  // something.Set 
  //.... 

这里是不知道Set是什么Set

package something; 
import java.util.Set; 
  //.... 
Set set = null;  // java.util.Set 
  //.... 

这里就明确知道了Set 是 java.util.Set

命名冲突

比如两个类的名字相同会导致编译错误
网上最常见的例子就是同时导入

import java.awt.*
import java.util.*

List就会编译错误,虽然现在awt相关的类我们开发基本不会用到,但是使用import *确实会有这个问题

总结

  • 使用import *会影响一点编译时期的运行效率
  • 会产生命名冲突(实际少有遇到)
  • 不使用import *会导致看到很多显示的导入,有的人觉得不舒服

总的来说使用import *是更好一点,像技术极客追求规范就应该会禁止使用import *,相对传统的业务开发看来使用import *好像也没什么影响。总体来说还是要看开发团队的规范

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值