EffectiveJava-第41条 慎用重载

说明:以后本人展示的代码,不管是拷贝上来的还是自己写的,加上[color=darkred]@亲自执行[/color]的标签表示读者需要动手执行才能看见结果,以便体验读写代码的乐趣,而不是为了调大家胃口或者其它目的,感谢大家一起分享和阅读。
慎用重载,是因为使用不当会造成问题bug。

@亲自执行
public class CollectionClassifier
{
public static String classify(Set < ? > s)
{
return "Set";
}

public static String classify(List < ? > lst)
{
return "List";
}

public static String classify(Collection < ? > c)
{
return "Unknown Collection";
}

public static void main(String[] args)
{
Collection < ? >[] collections = {new HashSet < String >(),new ArrayList < BigInteger >(),new HashMap < String,String >().values()};
for(Collection < ? > c:collections)
System.out.println(classify(c));
}
}

有人可能已经看出会打印什么内容了,如果你不明白,请亲自执行一下。
为什么只会调用同一个方法呢?原因在此:[b]调用哪个重载方法在编译期做出决定的,根据方法的参数类型选择。[/b]
我们可以实用覆盖,利用多态的特性解决上述问题:
class Wine
{
String name()
{
return "wine";
}
}

class SparklingWine extends Wine
{
@Override
String name()
{
return "sparkling wine";
}
}

class Champagne extends SparklingWine
{
@Override
String name()
{
return "champagne";
}
}

public class Overriding
{
public static void main(String[] args)
{
Wine[] wines = {new Wine(),new SparklingWine(),new Champagne()};
for(Wine wine:wines)
System.out.println(wine.name());
}
}

请你想一想为什么能正确调用相应的方法?(总是我说出来就没有意思了)
你可能说,俺们是高手,不会犯第一个例子那样的错误!!
[color=darkred]@亲自执行[/color]

public class SetList
{
public static void main(String[] args)
{
Set < Integer > set = new TreeSet < Integer >();
List < Integer > list = new ArrayList < Integer >();
for(int i = -3;i < 3;i++)
{
set.add(i);
list.add(i);
}
for(int i = 0;i < 3;i++)
{
set.remove(i);
list.remove(i);
}
System.out.println(set + " " + list);
}
}

偶的神啊,怎么会这样啊??!!当你看见打印的结果,可能会发出这样想法。
编写JDK的同行算是牛人了吧,同样会犯错。所以,为了确保代码质量,我们就“谨慎一点”是应该的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值