我相信这不可行,但我还是想问,以防万一我错了:
我听过很多次,每当你在一批中有一定数量的非常相似的代码行时,你应该总是遍历它们。
所以说我有以下内容。
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都没有提出否定证据。
感谢您快速确认!
答案 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)
反射将是您的示例案例的唯一选择。