是否可以循环设置器和吸气剂?

时间:2011-10-13 15:37:47

标签: java loops getter-setter

我相信这不可行,但我还是想问,以防万一我错了:

我听过很多次,每当你在一批中有一定数量的非常相似的代码行时,你应该总是遍历它们。

所以说我有以下内容。

setPos1(getCard1());
setPos2(getCard2());
setPos3(getCard3());
setPos4(getCard4());
setPos5(getCard5());
setPos6(getCard6());
setPos7(getCard7());
setPos8(getCard8());
setPos9(getCard9());
setPos10(getCard10());
setPos11(getCard11());
setPos12(getCard12());

没有办法减少代码行,例如,下面,右边?

for (i = 0; i < 12; i++) {
setPos + i(getCard + i)());
}

我确信在某个地方之前会有人问这个问题,但Google和SO Search都没有提出否定证据。

感谢您快速确认!

6 个答案:

答案 0 :(得分:10)

没有反思就无法在Java中专门做到这一点,我认为这不值得。这看起来更像是一个提示,您应该重构getcard函数以获取整数参数。然后你就可以循环了。

答案 1 :(得分:3)

你可以通过反思来做到这一点,但这会很麻烦。一种更好的方法可能是制作通用的setPos()和getCard()方法,您可以在其中传递当前项的索引。

答案 2 :(得分:2)

您需要抛弃getter / setter对,并使用List来存储您的对象,而不是尝试将所有内容都填充到一个God对象中。

这是一个人为的例子:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Foo {
    public static class Card {
        int val;

        public Card(int val) {
            this.val = val;
        }

        public int getVal() {
            return val;
        }

    }

    public static class Position {
        int value;

        public Position(Card card) {
            this.value = card.getVal();
        }
    }

    public static void main(String[] args) {
        List<Card> cards = new ArrayList<Card>(Arrays.asList(new Card(1), new Card(2), new Card(3)));
        List<Position> positions = new ArrayList<Position>();
        for (Card card : cards) {
            positions.add(new Position(card));
        }
    }

}

答案 3 :(得分:2)

这是一个简单的代码片段,演示了如何使用反射来遍历某个对象的getter以检查返回的值是否为null:

css/dist/

与其他人一样,可能它并不是一个优雅的实现。这只是为了完整起见。

答案 4 :(得分:1)

您无法动态构造方法名称,然后调用它(不进行反射)。即使有了反射,它也会有点脆弱。

一种选择是将所有这些操作集中到一个方法,如setAllPositions,然后调用该方法。

或者,您可以拥有一个位置数组,然后只需遍历数组,在每个索引处设置值。

Card[] cardsAtPosition = new Card[12];

然后像

public void setCardsAtEachPosition(Card[] valuesToSet) {
   // check to make sure valuesToSet has the required number of cards
   for (i = 0; i < cardsAtPosition.length; i++) {
       cardsAtPosition[i] = valuesToSet[i];
   }
}

答案 5 :(得分:0)

反射将是您的示例案例的唯一选择。