在没有动态类型的情况下在循环中推送/弹出

时间:2014-09-17 03:59:36

标签: java python types stack static-typing

---第三,希望最终编辑--- 首先让我说这是一个关于代码压缩的问题,几乎与堆栈无关。在下面的代码中,您将注意到每个块由openGl pushmarix()和popmatrix()

分隔。

这就是问题所在!在这种方法中,只有太多的推/弹调用,我想压缩它,这样每次只调用一次push和pop。

    glPushMatrix();     //<---------  push matrix
    Vec2 torPos = ...;
    glTranslatef(...);
    glRotated(...);
    glRectf(...);
    glPopMatrix();      //<---------  pop matrix

    glPushMatrix();     //<---------  push matrix
    Vec2 armPos = i.arm.getPosition().mul(30);
    glTranslatef(...);
    glRotated(...);
    glRectf(...);
    glPopMatrix()       //<---------  pop matrix

    glPushMatrix();     //<---------  push matrix
    GL11.glColor3f(...);
    Vec2 anchor = new Vec2(0,0);
    i.torsoArmJoint.getAnchorA(anchor);
    glTranslatef(....);
    glRectf(...);
    glPopMatrix();      //<---------- pop matrix

最明智的做法(似乎)是通过实现for循环。这就是问题的来源......因为坦率地说,如果在前面的代码中有其他方法可以解决问题,那也无关紧要。

我想知道的是......在java中,你是否可以拥有一个循环,例如push / pop上下文,你必须有line1,然后是-whatever-然后是line2,其中顺序必须是line1 ,代码,第2行。

将之前的代码转换为以下代码似乎很明智:

    glPushMatrix();     //<---------  push matrix
    method1();
    glPopMatrix();      //<---------  pop matrix

    glPushMatrix();     //<---------  push matrix
    method2();
    glPopMatrix()       //<---------  pop matrix

    glPushMatrix();     //<---------  push matrix
    method3();
    glPopMatrix();      //<---------- pop matrix

甚至是这样:

object1.pushmatrix();    //<---------  push matrix
object1.method();
object1.popmatrix();     //<---------  push matrix

object2.pushmatrix();    //<---------  push matrix
object2.method();
object2.popmatrix();     //<---------  push matrix

object3.pushmatrix();    //<---------  push matrix
object3.method();
object3.popmatrix();     //<---------  push matrix

但正如你所看到的,这里有一个模式(因此注释),我必须不断地为每个过程调用这些push / pop方法。在python中,我可以简单地将所有方法调用附加到列表中,然后使用for循环遍历列表:

methodList = [method1, method2, method3]
for method in methodList:
    glPushMatrix()     //<---------  push matrix
    method()
    glPopMatrix()      //<---------- pop matrix

现在,如果您不知道python只知道有一个调用列表,那么您将调用for循环中的调用作为&#39;方法&#39;。正如您所看到的,这将解决问题,因为现在只有一个推送和一个弹出。但是我不知道如何在java中这样做。

1 个答案:

答案 0 :(得分:1)

我的方法是将所有方法分组到一个虚拟类中,并使用反射来访问它。以下是实施示例:

public class StackExample {

  // Other declaration here ----------

  public static void main(String[] args){

    MethodCollection collection = new MethodCollection();

    String[] methods = {"method1", "method2", "method3"};

    // requires to catch exception just in case the method does not exist
    try {
        for (String a : methods) {
            glPushMatrix(); // <----- Push matrix
            MethodCollection.class.getMethod(a, null).invoke(collection,null);
            glPopMatrix();  // <----- Pop matrix
        }
    }
    catch (Exception e){
        e.printStackTrace();
    }

  }

 static class MethodCollection {

    /**
     * Empty constructor
     */
    public MethodCollection(){}

    public void method1(){
        System.out.println("Method 1");
    }

    public void method2(){
        System.out.println("Method 2");
    }

    public void method3(){
        System.out.println("Method 3");
    }
  }
}