`
lxiaodao
  • 浏览: 121548 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

EffectiveJava-第41条 慎用重载

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

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

请你想一想为什么能正确调用相应的方法?(总是我说出来就没有意思了)
你可能说,俺们是高手,不会犯第一个例子那样的错误!!
@亲自执行
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的同行算是牛人了吧,同样会犯错。所以,为了确保代码质量,我们就“谨慎一点”是应该的。
分享到:
评论

相关推荐

    [] - 2022-08-06 慎用BeanUtils,性能真的拉跨!.pdf

    互联网资讯,技术简介,IT、AI技术,人工智能

    EffectiveJava:有效的 Java 示例

    《EffectiveJava》是Java开发领域的经典著作,由Joshua Bloch撰写,提供了许多关于如何编写高效、可维护和设计良好的Java代码的实用建议。这本书的第2版在原有的基础上进行了更新,以适应Java语言的新发展。现在,...

    java大作业-聊天室,有待完善,慎用

    JavaFX是Java平台上的一个强大的用户界面工具包,用于创建...但是,由于标题中提到“有待完善,慎用”,说明这个项目可能还在开发阶段,可能存在一些未解决的问题,因此在使用时需要谨慎,可能需要进一步完善和调试。

    java源码总结-Effective-Java-3E:有效Java第三版的源代码示例和摘要的回购

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,现在已经更新到第三版。这本书汇集了众多编程最佳实践,旨在帮助开发者写出更高效、更可维护的Java代码。以下是对《Effective Java》第三版源...

    [] - 2023-04-18 Java 陷阱:慎用入参做返回值!!!.pdf

    互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...

    无线网络密码破解方法-比较强,慎用

    本文只做技术交流之用,提醒各位注意无线网络安全性,请勿用于其他用途,否则后果自负。 前言:面对电脑搜索到的无线网络信号,你是否怦然心动?但看到一个个“启用安全的无线网络”你是否又感到有一丝遗憾。本人...

    [] - 2022-12-14 线上慎用 BigDecimal ,坑的差点被开了......pdf

    互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...

    以SSH框架与jQuery技术为_省略_础的Java_Web开发应用探讨_何晶.pdf

    Spring是一个全面的企业级应用框架,提供了依赖注入和面向切面编程等功能,有助于简化Java应用程序的开发。Struts是MVC设计模式的实现,主要用于处理HTTP请求和响应,管理视图与控制器之间的交互。Hibernate是一个...

    精彩编程与编程技巧-在ActiveX DLL工程中慎用App对象.txt...

    本文将基于给定文件信息,详细探讨“精彩编程与编程技巧—在ActiveX DLL工程中慎用App对象”这一核心知识点,旨在为读者提供一个全面而深入的理解。 ### 一、ActiveX DLL与App对象的基础概念 #### ActiveX DLL ...

    加密的惨剧!慎用文件夹加密软件!

    加密的惨剧!慎用文件夹加密软件! 加密的惨剧!慎用文件夹加密软件!

    管理培训-领导需要慎用话语权.docx

    在管理培训中,领导者的话语权是一项关键议题。领导者在组织中的地位往往赋予他们较高的权威,但这并不意味着他们应该滥用或过度使用这种权力。在《X市人在纽约》这部剧中,姜文饰演的角色王启明就是一个典型的例子...

    华为网络产品与CISCO产品详细比较(内部学习-客户慎用)

    华为网络产品与CISCO产品详细比较(内部学习-客户慎用)

    java中慎用继承 以及java中的stack的败笔

    然而,如同任何技术一样,Java在设计过程中也存在一些争议和值得探讨的问题,其中之一便是继承的使用。本文将深入讨论Java中继承的优缺点,以及在特定情况下如何避免使用继承,同时探讨`java.util.Stack`类的设计...

    我的四轴专用PID参数整定方法及原理---超长文慎入

    四轴飞行器的PID(比例-积分-微分)控制器是一种闭环控制算法,广泛应用于飞行器的姿态控制中。其核心在于根据系统的当前状态和期望状态之间的差异(误差),通过比例(P)、积分(I)和微分(D)三个调节参数,实现...

    暴力删除一切顽固文件,慎用!

    把要删除的文件拖到这个文件上面即可。注意,这是强力删除。一定慎用,因为连垃圾箱都会没有的。

    Java有陷阱,用时需谨慎-慎用入参做返回值.zip

    计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...

    易语言处理事件命令慎用时钟版

    易语言处理事件命令慎用时钟版源码,处理事件命令慎用时钟版

    慎用动态编译

    标题“慎用动态编译”指的是在编程过程中对动态编译这一技术的谨慎态度。动态编译是程序运行时根据需要将源代码编译为可执行代码的过程,与静态编译(编译时一次性完成)形成对比。在Java中,JIT(Just-In-Time)...

    离线JDK9中文版 | API_jdk-9.CHM

    Java开发工具包(Java Development Kit,简称JDK)是Java编程语言的标准开发环境,它包含了编译、运行Java程序所需的各种工具和库。这个离线JDK9中文版的API文档,即`API_jdk-9.CHM`,是开发者在没有网络连接时查阅...

    开发者准则--java

    【开发者准则--Java】是Java开发领域中遵循的一系列最佳实践和原则,旨在提升代码质量、可维护性和团队协作效率。以下是对标题和描述中提到的开发者准则的详细解释: 一、为代码加注释 良好的注释是代码可读性的...

Global site tag (gtag.js) - Google Analytics