Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的优化方法_Java_Oop - Fatal编程技术网

Java中的优化方法

Java中的优化方法,java,oop,Java,Oop,我想在窗格中添加两个敌人,Dragon和Orc。这两个类都扩展了一个名为Entity的超类,我想为这两个方法创建一个方法。我已尝试在您要创建的类型的供应商中使用列表传递: public <T extends Sprite> void addThings(List<? super T> list, Supplier<T> supplier) { 您可以这样调用它: addThings(listOfDragons, Dragon::new); addThings

我想在窗格中添加两个敌人,
Dragon
Orc
。这两个类都扩展了一个名为
Entity
的超类,我想为这两个方法创建一个方法。我已尝试在您要创建的类型的
供应商中使用
列表传递:

public <T extends Sprite> void addThings(List<? super T> list, Supplier<T> supplier) {
您可以这样调用它:

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

传入要创建的类型的供应商

public <T extends Sprite> void addThings(List<? super T> list, Supplier<T> supplier) {
您可以这样调用它:

addThings(listOfDragons, Dragon::new);
addThings(listOfOrcs, Orc::new);
通用可能会帮助你

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);
  }
}
public void addEntity(列表,类clazz){
双图像宽度=0;
对于(int i=0;i<6;i++){
T entity=clazz.newInstance();
imageWidth=entity.getWidth();
pane.getChildren().add(实体);
列表。添加(实体);
}
}
通用可能会对您有所帮助

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);
  }
}
public void addEntity(列表,类clazz){
双图像宽度=0;
对于(int i=0;i<6;i++){
T entity=clazz.newInstance();
imageWidth=entity.getWidth();
pane.getChildren().add(实体);
列表。添加(实体);
}
}

为您需要对所有实体执行的操作添加一个接口或向实体添加方法。这将包括一个工厂方法来创建特定子类型的新实例,以及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 );
}
public void addEnemy(列表,实体敌人){
双图像宽度=0;
对于(int i=0;i<6;i++){
Entity SomeDebuy=敌人。createNewInstance();
imageWidth=some敌军。getWidth();
pane.getChildren().add(someDebuy);
添加(一些敌人);
}

}

为您需要对所有实体执行的操作添加一个接口或向实体添加方法。这将包括一个工厂方法来创建特定子类型的新实例,以及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 );
}
public void addEnemy(列表,实体敌人){
双图像宽度=0;
对于(int i=0;i<6;i++){
Entity SomeDebuy=敌人。createNewInstance();
imageWidth=some敌军。getWidth();
pane.getChildren().add(someDebuy);
添加(一些敌人);
}

}考虑到你的班级结构是这样的

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);
    }
   }
public void addDragon(列表,类clazz)
抛出IllegalAccessException,实例化Exception{
双图像宽度=0;
对于(int i=0;i<6;i++){
T敌人=clazz.newInstance();
imageWidth=敌人。getWidth();
pane.getChildren().add(敌人);
列表。添加(敌人);
}
}

这里通过传递实现敌人的任何类,使您的方法能够灵活调用。

考虑到您的类结构,如下所示

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);
    }
   }
public void addDragon(列表,类clazz)
抛出IllegalAccessException,实例化Exception{
双图像宽度=0;
对于(int i=0;i<6;i++){
T敌人=clazz.newInstance();
imageWidth=敌人。getWidth();
pane.getChildren().add(敌人);
列表。添加(敌人);
}
}


这里通过传递实现敌人的任何类,使您的方法具有调用的灵活性。

“我尝试过使用“列表列表”和“列表列表”[…]”-我不理解。备注:您不应该使用
列表
列表
,而应该使用
列表您可以使用一个界面。您能详细说明一下吗,Compass?:)仅供参考,优化通常指性能调整。从这个意义上讲,合并冗余代码并不是一种优化。”我尝试过使用“列表”和“列表”[…]”——我不理解。备注:您不应该使用
列表
列表
,而应该使用
列表您可以使用一个界面。您能详细说明一下吗,Compass?:)仅供参考,优化通常指性能调整。从这个意义上讲,合并冗余代码不是一种优化。这只适用于iff
T
具有无参数、可访问的构造函数。我应该将该特定方法放在哪个类中?public是一个新类吗?@Yani不是,它是一个泛型方法。但是从它的声明来看,(使用
列表这只在iff时有效。
T
有一个无参数的、可访问的构造函数。我把那个特殊的方法放在哪个类中?public是一个新类吗?@Yani不,它是一个泛型方法。但是从它的声明来看(使用
列表这仅在以下情况下有效。
T
具有无参数、可访问的构造函数。@Turing85它没有,因为它将引发选中的异常。@AndyTurner,并且它被设置为
不推荐的
=)这只在以下情况下起作用。
T
具有无参数、可访问的构造函数。@Turing85不起作用,因为它将引发选中的异常。@AndyTurner,并且它被设置为
弃用的
=)我认为常见的超类型是
Sprite
。但从技术上讲,上限根本没有必要。@shmosel甚至没有调用width方法(但不知道为什么会这样做…)不,这可能是必要的。我不知道我在想什么。@shmosel好吧,我已经将它更新为使用
Sprite
。谢谢。我认为常见的超类型是
Sprite
。但从技术上讲,上限根本不必要。@shmosel甚至没有调用width方法(但不知道为什么会这样做…)不,这可能是必要的。我不知道我在想什么。@shmosel好吧,我已经将它更新为使用
Sprite
。谢谢。