Java中的优化方法

时间:2018-05-03 19:00:17

标签: java oop

我想在窗格中添加两个敌人DragonOrc。这两个类都扩展了一个名为Entity的超类,我想为这两个方法创建一个方法。我已尝试使用List<? extends Sprite> listList<? super Sprite> list,但它无法正常工作,因为我需要将对象添加到列表中,稍后在调用add方法时读取它。

public void addDragon(List<Dragon> list) {
    double imageWidth = 0;
    for(int i = 0; i < 6; i++) {
        Dragon dragon = new Dragon();
        imageWidth = dragon.getWidth();
        pane.getChildren().add(dragon);
        list.add(dragon);
    }
}

public void addDragon(List<Orc> list) {
    double imageWidth = 0;
    for(int i = 0; i < 6; i++) {
        Orc orc = new Orc();
        imageWidth = orc.getWidth();
        pane.getChildren().add(orc);
        list.add(orc);
    }
}

4 个答案:

答案 0 :(得分:2)

传入您要创建的Supplier类型:

public <T extends Sprite> void addThings(List<? super T> list, Supplier<T> supplier) {

然后用该供应商的调用替换构造函数:

T thing = supplier.get();
imageWidth = thing.getWidth();
pane.getChildren().add(thing);
list.add(thing);

您可以调用以下内容:

addThings(listOfDragons, Dragon::new);
addThings(listOfOrcs, Orc::new);

答案 1 :(得分:1)

考虑你的类结构是这样的

public interface Entity {
// abstract methods here
}

public class Orc implements Entity {
 //Code here
}


public class Dragon implements Entity {
 //Code here
}

现在修改你的方法如下

    public <T extends Entity> void addDragon(List<T> list, Class<T> clazz) 
  throws IllegalAccessException, InstantiationException {
    double imageWidth = 0;
    for(int i = 0; i < 6; i++) {
        T enemy = clazz.newInstance();
        imageWidth = enemy.getWidth();
        pane.getChildren().add(enemy);
        list.add(enemy);
    }
   }

这里&lt; T extends Entity&gt; 通过传递任何实现Enemies的类来调用您的方法。

答案 2 :(得分:0)

Generic可能会帮助你

public <T extends Entity> void addEntity(List<T> list, Class<T> clazz) {
  double imageWidth = 0;
  for(int i = 0; i < 6; i++) {
    T entity = clazz.newInstance();
    imageWidth = entity.getWidth();
    pane.getChildren().add(entity);
    list.add(entity);
  }
}

答案 3 :(得分:0)

为所有实体添加接口或向Entity添加方法。这将包括一个工厂方法来创建特定子类型的新实例,以及getWidth。使用要添加的类型的原型实例调用addEnemy。

public void addEnemy(List<Entity> list,Entity enemy) {
double imageWidth = 0;
for(int i = 0; i < 6; i++) {
    Entity someEnemy = enemy.createNewInstance();
    imageWidth = someEnemy .getWidth();
    pane.getChildren().add(someEnemy );
    list.add(someEnemy );
}

}