`

Use overloading judiciously

UP 
阅读更多

Effective Java 2rd ITEM 41: USE OVERLOADING JUDICIOUSLY

审慎地使用重载,看下面的例子,猜一下结果会是什么:

 

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

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);
	}
}

 

 

 

 

安全、保守的策略是不要设计两个具有相同参数的重载函数,除非参数类型差别很大,Two types are radically different if it is clearly impossible to cast an instance of either type to the other.

上例的结果是[-3, -2, -1] [-2, 0, 2],原因解释如下:

 

Here’s what’s happening: The call to set.remove(i) selects the overloading
remove(E), where E is the element type of the set (Integer), and autoboxes i
from int to Integer. This is the behavior you’d expect, so the program ends up
removing the positive values from the set. The call to list.remove(i), on the
other hand, selects the overloading remove(int i), which removes the element at
the specified position from a list. If you start with the list [-3, -2, -1, 0, 1, 2]
and remove the zeroth element, then the first, and then the second, you’re left with
[-2, 0, 2], and the mystery is solved. To fix the problem, cast list.remove’s
argument to Integer, forcing the correct overloading to be selected. Alternatively,
you could invoke Integer.valueOf on i and pass the result to list.remove.
Either way, the program prints [-3, -2, -1] [-3, -2, -1], as expected:

 

for (int i = 0; i < 3; i++) {
    set.remove(i);
    list.remove((Integer) i); // or remove(Integer.valueOf(i))
}
 

主要是说的Set的remove选择了remove(E)重载版本(只有这一个吧),而List选择了remove(i)

分享到:
评论

相关推荐

    Effective Java 3rd edition(Effective Java第三版英文原版)附第二版

    Item 52: Use overloading judiciously Item 53: Use varargs judiciously Item 54: Return empty collections or arrays, not nulls Item 55: Return optionals judiciously Item 56: Write doc comments for all ...

    Overloading&Overriding

    "Overloading&Overriding" 在面向对象编程中,Overloading和Overriding是两个重要的概念,它们都是多态性的体现。下面我们将对这两个概念进行详细的解释。 1. 方法重载(Overloading) 方法重载是让类以统一的...

    operator-overloading-js, JS简单运算符重载库.zip

    operator-overloading-js, JS简单运算符重载库 目录Operator-Overloading-JS安装工具node MODULE ( NPM )浏览器( Bower )Sneak示例重载运算符设计考虑/非常重要/必须阅读。Definig使用运算符重载的上下文

    Google C++ Style Guide_英文版.pdf

    - **Function Overloading:** Use function overloading judiciously to provide a clear API. - **Default Arguments:** Default arguments can make functions more flexible but can also introduce ambiguity. -...

    Functional Programming with Overloading and Higher-Order Polymorphism PDF 英文

    另一个重要的概念是过载(overloading)。在函数式编程中,过载通常指的是同一个函数名可以用于不同的数据类型。这是通过类型类(type classes)机制实现的,类型类定义了一组函数签名,任何实现了这些签名的类型都...

    Function_Overloading_Illustration.rar_C Builder

    在C++编程语言中,函数重载(Function Overloading)是一项重要的特性,它允许我们在同一个作用域内定义多个同名但具有不同参数列表的函数。这样做的好处是能够为相似的操作提供简洁且易于理解的接口,同时提高了...

    VB_NET_Framework_Scoping_Overloading.rar_Framework

    本文将深入探讨VB.NET中的三个关键概念:作用域(Scoping)、重载(Overloading)和覆盖(Overriding),这些都是理解和编写高效、可维护的VB.NET代码的基础。 1. **作用域(Scoping)**: 作用域决定了变量、常量...

    交大C++编程课件 3.Parameter and Overloading

    函数重载(Overloading) 在C++中,函数重载是指允许定义多个同名函数,但这些函数必须具有不同的参数列表(参数类型、个数或顺序不同)。通过这种方式,可以根据不同的输入提供不同的行为。 - **示例**:假设有...

    软件设计课件:Lecture 07 C Operator Overloading.ppt

    在“软件设计课件:Lecture 07 C++ Operator Overloading.ppt”中,该主题深入探讨了这个概念及其在实际编程中的应用。 首先,运算符重载的基本思想是赋予已存在的运算符新的含义,使得当这些运算符用于不同的数据...

    Addison.Wesley.C++.by.Dissection.2002.pdf

    - **Software Engineering: When to Use Overloading:** Provides guidelines on when to use overloading. - **C++ Compared with Java:** Continues the comparison. ### Chapter 6: Templates and Generic ...

    operator overloading and copy constructors 英文原版

    在C++编程语言中,操作符重载和复制构造函数是两个高级特性,它们允许程序员扩展标准操作符的功能,以适应自定义类的行为,同时控制对象的复制过程。 操作符重载允许程序员为类定义的操作符提供特定的实现,使得...

    C++ Operator Overloading

    关于C++操作符重载的一个文档。有了它,关于操作符重载的东西你就不用再找资料拉~

    VC.data.operator.overloading.rar_The Operator

    "VC.data.operator.overloading.rar_The Operator"这个资源很可能包含了一些关于在Visual C++环境下如何有效地使用和实现运算符重载的经典教程和示例。 运算符重载并不创建新的运算符,而是给已有的运算符赋予新的...

    python学习-13-op-overloading

    Python是一种解释型的、面向对象的、带有动态语义的高级程序设计语言。它是由荷兰人吉多·罗萨姆于1989年发布的,第一个公开发行版发行于1991年。Python注重解决问题的方法,而不是语法和结构。...

    Cplusplus.in.24.Hours.Sams.Teach.Yourself.6th.Edition

    Use operator overloading Extend classes with inheritance Use polymorphism and derived classes Employ object-oriented analysis and design Table of Contents Part I: Beginning C++ HOUR 1: Writing Your ...

    Overloading

    在编程语言中,"Overloading" 是一个重要的概念,尤其在 C# 这样的面向对象的语言中。"Overloading",中文通常称为“重载”或“多态性的一种表现形式”,指的是在同一个作用域内可以有多个同名但参数列表不同的函数...

    Java 实例 - 重载(overloading)方法中使用 Varargs技术包含源代码和详细教程.zip

    Java编程语言提供了一种强大的特性,称为方法重载(overloading),它允许我们在同一个类中定义多个具有相同名称但参数列表不同的方法。本教程将深入探讨如何在重载方法中利用Varargs(可变参数)技术,这是一项非常...

    oop-java-overloading-KovacsAliz:oop-java-overloading-KovacsAliz由GitHub Classroom创建

    在这个项目"oop-java-overloading-KovacsAliz"中,我们将深入探讨Java中的一个关键概念——方法重载(Method Overloading)以及构造函数的应用。 方法重载是Java中实现多态性的一种方式,允许在一个类中定义多个...

    软件设计课件:Lecture 07 C++ Operator Overloading.ppt

    C++中的运算符重载是面向对象编程的一个关键特性,它允许我们为用户自定义类型定义运算符的行为,使得这些类型能够像内置类型(如int、float等)一样使用标准运算符。运算符重载并不创建新的运算符,而是对已有...

Global site tag (gtag.js) - Google Analytics