是否可以循环使用setter和getter方法?

4
我相信这种方法不可行,但我还是想问一下以防我错了:
我听说过很多次,每当你有一批非常相似的代码时,都应该通过循环来处理它们。因此,假设我有以下内容:
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)());
}

我相信这个问题以前肯定有人问过,但是谷歌和stackoverflow搜索都没有给出负面的证明。

感谢您快速确认这个问题!


https://dev59.com/6VnUa4cB1Zd3GeqPWw3f - mKorbel
6个回答

9

如果不使用反射,Java 中没有特定的方法来实现这一点,并且我认为这并不值得。这更像是提示您应该重构 getcard 函数以接受一个整数参数,然后您可以使用循环。


2
在重构函数以接受整数参数方面,您的想法绝对是正确的。拥有两组十二个几乎相同的函数毫无意义。 - Prodicus
我同意这似乎是一个糟糕的设计。很可能poscard是集合或数组,因此使用带有额外索引的getter和setter会更好一些。 - Thomas
2
啊,从没想过这个。谢谢你的提示。我看了一眼反射机制,同意这会像在德国所说的对着麻雀开炮一样大材小用。 - s.d
@baphomet13 - 我猜你已经看过这个了:http://www.youtube.com/watch?v=63Y5XjlO4vk - Joe

4
这是一个简单的代码片段,展示了如何使用反射循环遍历某个对象的getter方法,以检查返回的值是否为null:
for (Method m : myObj.getClass().getMethods()) {
    // The getter should start with "get" 
    // I ignore getClass() method because it never returns null
    if (m.getName().startsWith("get") && !m.getName().equals("getClass")) {
            // These getters have no arguments
            if (m.invoke(myObj) == null) {
                // Do something
            }
    }
}

像其他人所说的那样,可能这不是一个优雅的实现。它只是为了完整性而已。


3

您可以通过反射来做到这一点,但是这将会很繁琐。更好的方法可能是将通用的setPos()和getCard()方法变成通用方法,您可以将当前元素的索引传递给它们。


+1:您想要设置这样的值表明,为每个特定值设置set/get并不适合您的需求。 - unholysampler

2
你需要放弃使用getter/setter对,而是使用一个List来存储你的对象,而不是试图将所有内容都塞进一个大对象中。
以下是一个人为制造的例子:
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));
        }
    }

}


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];
   }
}

0

在你的例子中,反射会是你唯一的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接