EffectiveJava(27)优先考虑使用泛型方法
泛型方法也可以从泛型类中获得同等收益,泛型方法的转换也十分简单,只需将原生态类型改为泛型,基本就可以解决问题
如:一个返回两个集合的联合
public static Set union(Set s1,Set s2){
Set result = new HashSet(s1);
result.addAll(s2);
return result;
}
它的编译虽然会通过,但是会有两条类型转换警告,要消除这些警告,将他们转换成泛型集合即可.
----->>>>>
public static <E> Set<E> union(Set<E> s1,Set<E> s2){
Set<E> result = new HashSet<E>(s1);
result.addAll(s2);
return result;
}
该方法可以返回相同的有限制的通配符类型的集合.因为他们在"相加"的时候,java会为我们做类型推导
PS:类型推导 -- 便一起通过检查方法茶树的类型来计算类型参数的值
但是在调用泛型构造器的时候,要明确传递类型参数的值可能有些麻烦 --->>>
Map<String,List<String>> anagrams = new HashMap<String,List<String>>();
我们可以编写一个泛型静态工厂方法消除这种冗余
public static <K,V> HashMap<K,V> newHashMap(){
return new HashMap<K,V>();
}
这个时候我们只需作如下声明:
Map<String,List<String>> anagrams =newHashMap();
注:语言所做的类型推导与调用泛型方法时所做的JDK1.6之前还不是相同的.
与本节相关的使用方式是泛型单例工厂:创建不可变担忧适合于许多不同类型的对象 –
运用泛型擦除特性,给所有必要的泛型参数使用单个对象,但是要编写一个静态工厂方法,重复地给每个必要的类型参数分发对象
如:定义个返回接收泛型的接口
public inteface UnaryFunction<T>{
T apply(T arg);
}
通过泛型只需创建一个实例,不必为每种不同类型创建.
private static UnaryFunction<Object> IDENTITY_FUNCTION = new naryFunction<Object>(){
public Object apply(Object arg){
return arg;
}
};
//IDENTITY_FUNCTION 是无状态的并且它的类型参数是无限的,所以他可以安全的用在其他类型
public static <T> UnaryFunction<T> identityFunction(){
return (UnaryFunction<T>)IDENTITY_FUNCTION;
}
恒等函数:他返回未被修改的参数,因此无论T的值是什么,用他作为UnaryFunction<T>都是类型安全的
泛型接口范例程序:
String[] strings = {"a","b","c"};
UnaryFunction<String> sameString = identityFunction();
for(String s:Strings)
System.out.println(sameString.apply(s));
Number[] numbers = {1,2.0,3L};
UnaryFunction<NUmber> sameNumber = identityFunction();
for(Number n:numbers)
System.out.println(sameNumber.apply(n));
递归类型限制:通过某个包含该类型参数本身的表达式来限制类型参数
示例:Comparable接口定义类型的自然顺序
public interface Comparable<T>{
int compareTo(T o);
}
public static <T extends Comparable<T>> T max(List<T> list){
Iterator<T> it = list.iterator();
T result = it.next();
While(i.hasNext()){
T t = it.next();
if(t.compareTo(result)>0)
result = t;
}
return result;
}
总结:泛型方法就像泛型一样,使用起来比要求客户端转换属兔参数并返回值的方法类的更加安全,也更加容易.就像类型一样,你应该确保新方法可以不用转换就能使用,这通常意味着要将它们泛型化.并且就像类型一样,还应该将现有的方法泛型化,使新用户使用起来更加轻松,且不会破坏现有的客户端.
EffectiveJava(27)优先考虑使用泛型方法的更多相关文章
- EffectiveJava——复合优先于继承
继承时实现代码重用的重要手段,但它并非永远是完成这项工作的最佳工具,不恰当的使用会导致程序变得很脆弱,当然,在同一个程序员的控制下,使用继承会变的非常安全.想到了很有名的一句话,你永远不知道你的用户是 ...
- Effecvtive Java Note
代码应该被重用,而不是被拷贝 同大多数学科一样,学习编程的艺术首先要学会基本的规则,然后才能知道什么时候可以打破这些规则 创建和销毁对象 1.考虑用静态工厂方法代替构造器. 优势:有名称.不必再每 ...
- 读effection java
1.考虑用静态工厂方法代替构造器 public static Boolean valueOf(boolean b){ return b?Boolean.TRUE:Boolean.FALSE; } 静态 ...
- 更新日志(建议升级到2016.12.17) && 更新程序的方法
更新程序的方法: 1,在控制面板里点击备份当前数据库文件到磁盘,把当天获取的信息从内存写到磁盘/存储卡.2,下载最新版的源码 wget -O "infopi.zip" " ...
- 《C++编程规范:101条规则、准则与最佳实践》学习笔记
转载:http://dsqiu.iteye.com/blog/1688217 组织和策略问题 0. 不要为小事斤斤计较.(或者说是:知道什么东西不需要标准化) 无需在多个项目或者整个公司范围内强制实施 ...
- 更新日志(建议升级到2017.1.18a) && 更新程序的方法
更新程序的步骤: 1,在控制面板里点击备份当前数据库文件到磁盘,把当天获取的信息从内存写到磁盘/存储卡.2,下载最新版的源码 wget -O "infopi.zip" " ...
- C++编程规范(101条准则)
记录学习,方便以后查看. 2014-12-28 看完这本书,但是我做到的又有多少呢?确实有一部分 0 不要拘泥于小节 1 在高警告级别干净利落的进行编译,不放过任何警告 2 使用自动构建系统 3 使 ...
- effective-java学习笔记---优先使用泛型方法30
泛型类型比需要在客户端代码中强制转换的类型更安全,更易于使用. 当你设计新的类型时,确保它们可以在没有这种强制转换的情况下使用. 这通常意味着使类型泛型化. 如果你有任何现有的类型,应该是泛型的但实际 ...
- Effective Java 第三版——30. 优先使用泛型方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
随机推荐
- HDU 5114 扩展欧几里得
题目大意:给你两个球的坐标 他们都往(1, 1)这个方向以相同的速度走,问你他们在哪个位置碰撞. 思路:这种题目需要把x方向和y方向分开来算周期,两个不同周期需要用扩展欧几里得来求第一次相遇. #in ...
- linux 下 php 扩展
首先查看,php 原来安装的配置 /www/server/php/72/bin/php -i | grep configure (php 位置) 加上你的扩展 '--with-mcrypt' make ...
- vmware漏洞之一——转:利用一个堆溢出漏洞实现VMware虚拟机逃逸
转:https://zhuanlan.zhihu.com/p/27733895?utm_source=tuicool&utm_medium=referral 小结: vmware通过Backd ...
- Web移动应用调试工具——Weinre
如今人们也越来越习惯在手机上浏览网页,而在手机上这些针对桌面浏览器设计的网页经常惨不忍睹.Web应用开发者需要针对手机进行界面的重新设计,但是手机上并没有称心如意的调试工具(如Firebu ...
- Codeforces 285 E. Positions in Permutations
\(>Codeforces \space 285 E. Positions in Permutations<\) 题目大意 : 定义一个长度为 \(n\) 的排列中第 \(i\) 个元素是 ...
- 【二项式定理】【推导】计蒜客17115 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B. Coin
题意:投一枚硬币向上的概率是q/p.问你投K枚硬币,向上的枚数为偶数枚的概率是? 要求的即为. 这个东西是个二项展开式的偶数项系数和,来,我们复习一下高中数学,设f(x)=(ax+b)^n,则其偶数项 ...
- python基础之模块,面向对象
hash 什么是hash? hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值 为何用hash? hash值有三大特性: 1.只要传入的内容一样,得到的hash值必然一样 2.只要使 ...
- [HNOI/AHOI2017]影魔
[HNOI/AHOI2017]影魔 题目大意: 有一排\(n(n\le2\times10^5)\)个数\(k_{1\sim n}\).对于点对\((i,j)\),若不存在\(k_s(i<s< ...
- (原创)Stanford Machine Learning (by Andrew NG) --- (week 8) Clustering & Dimensionality Reduction
本周主要介绍了聚类算法和特征降维方法,聚类算法包括K-means的相关概念.优化目标.聚类中心等内容:特征降维包括降维的缘由.算法描述.压缩重建等内容.coursera上面Andrew NG的Mach ...
- opensuse语言环境和中文输入法
Auth: JinDate: 20140414 版本:13.1 步骤 1.安装opensuse 语言选择英文 2.设置最近的源 比如sohu,163 3.update 4.Control Center ...