栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

《Java编程思想》学习笔记 14.3.2 动态的instanceof

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《Java编程思想》学习笔记 14.3.2 动态的instanceof

Class.isInstance()方法提供了一种动态的测试对象的途径。于是所有那些单调的instanceof语句都可以从PetCount.java的例子中移除了。如下所示:
//: typeinfo/PetCount3.java
// Using isinstance()
import typeinfo.pets.*;

import java.util.;
import net.mindview.util.Print.
;

public class PetCount3 {
static class PetCounter extends linkedHashMap,Integer> {
public PetCounter () {
super(MapData.map(LiteralPetCreator.allTypes,0));
}
public void count(Pet pet) {
//Class.isInstance() eliminates instanceofs:
for(Map.Entry.Integer>pair:entrySet())
if(pair.getKey().isInstance(pet)) put (pair.getKey(),pair.getValue()+1);
]
public String toString() {
StringBuilder result = new StringBuilder("{");
for(Map.Entry,Integer> pair:entrySet()) {
result.append(pair.getKey().getSimpleName());
result.append("=");
result.append(pair.getValue());
result.append(",");
}
result.delete(result.length()-2,result.length());
result.append("}");
return result.toString();
}
}
public static void main(String[] args) {
PetCounter petCount = new PetCounter();
for(Pet pet : Pets.createArray(20)) {
printnb(pet.getClass().getSimpleName()+" ");
petCount.count(pet);
}
print();
print(petCount);
]
]//:~
为了对所有不同类型的Pet进行计数,PetCounter Map预加载了LiteralPetCreator.allTypes中的类型。这使用了net.mindview.util.MapData类,这个类接受一个Iteralbe(allTypes List)和一个常数值(在本例中是0),然后用allTypes中元素作为键,用0作为值,来填充Map。如果不预加载这个Map,那么你最终将只能对随机生成的类型进行技术,而不包括诸如Pet和Cat这样的基类型。
可以看到,isInstance()方法使我们不再需要instanceof表达式。此外,这意味着如果要求添加新类型的Pet,只需简单地改变LiteralPetCreator.java数组即可;而毋需改动程序其他部分(但是在使用instanceof时这是不可能的)。
toString()方法已经被重载,使得输出更容易被读取,而该输出与打印Map时所看到的典型输出仍然是匹配的。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/434691.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号