第27条:优先考虑泛型方法

如类可以从泛型中受益,方法也一样。静态工具方法尤其适合于泛型化。Collections中所有的方法是泛型化的。

一个返回两个集合的联合的例子:

publlic static Set union(Set s1, Set s2) {
    Set result = new HashSet(s1);
    result.addAll(s2);
    return result;
}

有两条警告,因为使用的是原生态类型Set。

泛型化该方法:

public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
    Set<E> result = new HashSet<E>(s1);
    result.addAll(s2);
    return result;
}

不再提示警告,因为它是类型安全的了。

泛型单例工厂:有时候需要创建不可变但又适合于不同类型的对象。

假设有一个接口,只有一个方法,接受和返回某个类型T的值

public interface UnaryFunction<T> {
    T apply(T arg);
}

假设要提供一个恒等函数,如果在每次需要的时候都重新创建一个,会很浪费,如果泛型被具体化了,每个类型都需要一个恒等函数,但是它们被擦除之后,就只需要一个泛型单例

private static UnaryFunction<Object> IDENTITY_FUNCTION =
            new UnaryFunction<Object>() {
                @Override
                public Object apply(Object arg) {
                    return arg;
                }
            };

    @SuppressWarnings("unchecked")
    public static <T> UnaryFunction<T> indentityFunction() {
        return (UnaryFunction<T>) IDENTITY_FUNCTION;
}

递归类型限制:通过某个包含该类型参数本身的表达式来限制类型参数。

public interface Comparable<T> {
    int compareTo(T o) {
}

类型限制<T extends Comparable<T>> 表示针对可以与自身进行比较的每个类型T

public static <T extends Comparable<T>> T max(List<T> list) {
    Iterator<T> i = list.iterator();
    T reuslt = i.next;
    while(i.hasNext()) {
        T t = i.next();
        if(t.compareTo(result) > 0)
            result = t;
    }
    return result;
}

该方法在列表中搜索,找出列表中的最大值。

时间: 2024-10-13 05:03:22

第27条:优先考虑泛型方法的相关文章

第二十七条:优先考虑泛型方法

就如类可以从泛型中受益一般,方法也可以.静态工具方法尤其适合与泛型化.JDK中的Collections泛型中的 所有"算法"方法都泛型化了. 如:下面这个方法返回连个集合的联合. public static  Set  union(Set  s1,Set  s2) { Set  result  = new  HashSet(s1); result.addAll(s2); return  result; } 为了方法变成类型安全的,要将方法声明修改为声明一个类型参数.表示这三个集合的元素

第27条:使用“class-continuation分类”隐藏实现细节

Objective-C动态消息系统(参见第11条)的工作方式决定了其不可能实现真正的私有方法或私有实例变量. 匿名分类的特点: 与普通的分类不同,它必须定义在其所接续的那个类的实现文件里. 唯一能声明实例变量的分类. 而该分类没有特定的实现文件,其中的方法都应该定义在类的主实现文件里. 用法: 1.向类中新增实例变量. 2.在里面声明私有方法. 3.隐藏类所遵循的协议. 4.将主接口声明的“只读”属性弄成“可读写”

[Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码

函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式传递给eval函数以达到同样的功能.程序员面临一个选择:应该将代码表示为函数还是字符串?毫无疑问,应该将代码表示为函数.字符串表示代码不够灵活的一个重要原因是:它们不是闭包. 闭包回顾 看下面这个图 js的函数值包含了比调用它们时执行所需要的代码还要多的信息.而且js函数值还在内部存储它们可能会引用

【Effective Java】7、优先考虑泛型方法

package cn.xf.cp.ch02.item27; import java.util.HashSet; import java.util.Set; public class Union { /** * 这个方法就会有警告 * @param s1 * @param s2 * @return */ public static Set union1(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return

《Effective Java》第5章 泛型

第23条:请不要在新代码中使用原生态类型 声明中具有一个或者多个类型参数( type parameter)的类或者接口,就是泛型(generic)类或者接口. 每种泛型定义一组参数化的类型(parameterized type),构成格式为: 先是类或者接口的名称,接着用尖括号(<>)把对应于泛型形式类型参数的实际类型参数列表括起来.例如,List 最后点,每个泛型都定义一个原生态类型[raw type],即不带任何实际类型参数的泛型名称.例如,List 如果使用原生态类型,就失掉了泛型在安全

《C++编程规范:101条规则、准则与最佳实践》学习笔记

转载:http://dsqiu.iteye.com/blog/1688217 组织和策略问题 0. 不要为小事斤斤计较.(或者说是:知道什么东西不需要标准化) 无需在多个项目或者整个公司范围内强制实施一致的编码格式.只要规定需要规定的事情:不要强制施加个人的喜好或者过时的做法. C++不应该使用匈牙利命名法.在有智能指针的情况下,单入口单出口可能不是必须的.代码要有自注释性. 1. 在高警告级别下干净地编译代码. 要把警告放在心上:使用你的编译器的最高警告级别.要求干净(没有警告)的构建.理解所

java编程的78条黄金法则

创建和销毁对象 1.考虑用静态工厂方法(返回类的实例的静态方法)代替构造器2.遇到多个构造器参数时要考虑用构造器3.用私有构造器或者枚举类型强化Singleton属性4.通过私有构造器强化不可实例化的能力5.避免创建不必要的对象6.消除过期的对象引用7.避免使用终结(final)方法 对于所有对象都通用的方法 8.覆盖equals时请遵守通用约定9.覆盖equals时总要覆盖hashCode10.始终要覆盖toString11.谨慎地覆盖clone12.考虑实现Comparable接口 类和接口

Effective Java总结的78条

1.考虑用静态工厂方法代替构造器 2.遇到多个构造器参数时要考虑用构造器 3.用私有构造器或者枚举类型强化Singleton属性 4.通过私有构造器强化不可实例化的能力 5.避免创建不必要的对象 6.消除过期的对象引用 7.避免使用finalizer方法 8.重写equals方法时遵守通用约定 9.重写equals时总要重写hashCode 10.始终要重写toString 11.谨慎的重写clone 12.考虑实现Comparable接口 13.使类和成员的可访问性最小化 14.在共有类中使用

c++书籍推荐《C++编码规范》下载

百度云及其他网盘下载地址:点我 编辑推荐 <C++编程规范:101条规则.准则与 实践>:良好的编程规范可以改善软件质量,缩短上市时间,提升团队效率,简化维护工作.在<C++编程规范:101条规则.准则与 实践>中,两位全世界最受尊敬的c++专家将全球c++社区的集体智慧和经验凝结成一整套编程规范.这些规范可以作为每一个开发团队制定实际开发规范的基础,更是每一位c++程序员应该遵循的行事准则.<C++编程规范:101条规则.准则与 实践>涵盖了c++程序设计的每一个方面