在一条线上调用多种方法?

时间:2014-01-18 02:52:59

标签: java methods

如果我的程序中有这样的行:

fireBalls.add(new Fireball(tileMap).setPosition(20, 20)); // set position is a method of the fireball class 

如何在同一行上调用多个这样的方法?

我试过了:

fireBalls.add(new Fireball(tileMap).setPosition(20, 20).setLeft());

但是setLeft()方法不能放在那里,因为无法在void类型上调用它。 我不能将它们分开,因为我不知道它在fireBalls ArrayList中的索引。

6 个答案:

答案 0 :(得分:6)

您可以修改Fireball方法,以便返回该类的实例(换言之return this;

public Fireball setPosition(int x, int y) {
    ...
    return this;
}

用这个,调用

new Fireball(tileMap).setPosition(20, 20)

将返回最近创建的实例,因此您可以从该实例调用setLeft()。 您也可以为setLeft()实现此功能。

public Fireball setLeft() {
    ...
    return this;
}

答案 1 :(得分:5)

看起来你似乎过于简洁,在这个过程中可能会让自己陷入困境。您不需要知道ArrayList索引来设置您正在添加的Fireball对象。您只需要引用该对象,您可以通过创建本地Fireball变量,设置它,然后将其添加到ArrayList来轻松实现。

为什么不简单地做:

Fireball fireball = new Fireball(tileMap);
fireball.setPosition(20, 20);
fireball.setLeft();
fireBalls.add(fireball);

答案 2 :(得分:3)

为此,您的Fireball类应遵循builder模式,哪些方法返回实例本身。因此,您可以将该方法链接起来。

例如方法:java.lang.StringBuilder#append()

答案 3 :(得分:1)

虽然我认为Hovercraft的答案是迄今为止最好的,但另一种解决方案可能是编写一个更好的构造函数。

一个构造函数,它接受tileMap(不管是这样),两个ints用于设置位置,以及boolean或枚举或适合任何setLeft()的内容可以在这里使用。

fireballs.add(new Fireball(tileMap, 20, 20, true));

答案 4 :(得分:0)

你可以像这样建立mathod链:

 class a{ 

    static a obj= new a();

    static a show(){
       System.out.println("omg");
       return obj;
    }

    static a show2(){
        System.out.println("god");
        return obj;
    }

    void show3(){
       System.out.println("Research done");
   }

}

公共课eg4 {

public static void main (String hv[]){
     a obj2= new a();
     obj2.show().show2().show3();
}

}

答案 5 :(得分:0)

您可以使用像这样的匿名内部类

fireBalls.add(new Fireball(tileMap){{setPosition(20, 20);}});

fireBalls.add(new Fireball(tileMap){{
    setPosition(20, 20);
    setLeft();
}});

我有时会在测试中使用它。不是最易读的方式。