Alb*_*Gao 6 java oop types class object
呼叫者:
switch (type){
case "creature":
Creature returnActor2 = getNextCreature();
boolean isEat2 = actOnNearby(getRightChromosome(Config.HardCode.creature), returnActor2.getLocation());
if (isEat2) {
actOnCreature(returnActor2);
}
break;
case "monster":
Monster returnActor3 = getNextMonster();
boolean isEat3 = actOnNearby(getRightChromosome(Config.HardCode.monster), returnActor3.getLocation());
if (isEat3) {
actOnMonster(returnActor3);
}
break;
}
Run Code Online (Sandbox Code Playgroud)
它将调用以下两种方法:
private Monster getNextMonster() {
ArrayList<Actor> nearbyActors = getActors();
Monster mine = new Monster();
for (Actor a : nearbyActors) {
if (a instanceof Monster) {
mine = (Monster) a;
}
}
return mine;
}
private Creature getNextCreature() {
ArrayList<Actor> nearbyActors = getActors();
Creature mine = new Creature();
for (Actor a : nearbyActors) {
if (a instanceof Creature) {
mine = (Creature) a;
}
}
return mine;
}
Run Code Online (Sandbox Code Playgroud)
问题
正如你所看到的,getNextXXXXX()方法是相同的,只返回不同的对象,逻辑是一样的,如何干?actOnXXXX()似乎也属于DRY类别,但它们大致相同,对不同的对象使用相同的逻辑.怎么解决这个?
让它接受一个classtype:
private <T> T getNext(Class<T> type) {
for (Actor a : getActors()) {
if (type.isAssignableFrom(a.getClass())) {
return (T) a;
}
}
return null; //or type.newInstance(); if you want a guaranteed object, but this restricts your constructor.
}
Run Code Online (Sandbox Code Playgroud)
或者使用Java 8:
private <T> T getNext(Class<T> type) {
return (T) getActors().stream()
.filter(a -> type.isAssignableFrom(a.getClass()))
.findFirst().orElse(null);
}
Run Code Online (Sandbox Code Playgroud)
但用法是一样的:
Monster next = getNext(Monster.class);
Run Code Online (Sandbox Code Playgroud)
打破这个问题,你知道两类事情:
你需要什么:
t
类型的对象.t
类型的方法你有什么:
t
你想要的类型t
类型此外,所有这些方法之间的唯一差异是一回事:它是哪种类型.所以我们确实"将它变成一个变量",因此它变成了一个方法参数.
打破这一点,我们只需要以完成此任务的方式组织代码:
method: //receives a "type" as a parameter
iterate the list of possible `t`s //our list of objects
if some_t == type //our comparison, previously `a instanceof Type`
return some_t //our result is found
return null //or a new object, but essentially our "default"
Run Code Online (Sandbox Code Playgroud)
这里唯一的主要区别是:
some_t instanceof Type
为type.isAssignableFrom(some_t.getClass())
原因在于这只是您在使用时如何确定这一点 Class<T>
通过反射动态制作对象会限制您的选项并具有处理异常.返回null
或空Optional<T>
是有助于表示您没有结果,并且调用者可以采取相应的行动.您也可能只是传递默认对象本身,然后返回instanceof
检查.
问自己这个相同的假设"我需要什么,我能提供什么/有什么",这将有助于你将问题分解为更小的步骤,并解决更大的难题.
归档时间: |
|
查看次数: |
252 次 |
最近记录: |