Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以循环设置器和获取器?_Java_Loops_Getter Setter - Fatal编程技术网

Java 是否可以循环设置器和获取器?

Java 是否可以循环设置器和获取器?,java,loops,getter-setter,Java,Loops,Getter Setter,我很有信心,这是行不通的,但我还是想问一下,以防万一我错了: 我听说过很多次,每当你在一批代码中有一定数量的非常相似的代码行时,你应该总是循环使用它们 比如说,我有下面这样的东西 setPos1(getCard1()); setPos2(getCard2()); setPos3(getCard3()); setPos4(getCard4()); setPos5(getCard5()); setPos6(getCard6()); setPos7(getCard7()); setPos8(getCa

我很有信心,这是行不通的,但我还是想问一下,以防万一我错了:

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

比如说,我有下面这样的东西

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)());
}
(i=0;i<12;i++)的
{
setPos+i(getCard+i)();
}
我敢肯定,以前有人会问过这个问题,但谷歌和其他搜索引擎都没有给出否定的证据


感谢您快速确认

对于您的示例来说,反射将是您唯一的选择。

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

你可以通过反射来完成,但这会很麻烦。更好的方法可能是创建通用的setPos()和getCard()方法,您可以将当前项的索引传递到这些方法中。

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

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

或者,您可以有一个位置数组,然后在数组上循环,设置每个索引的值

Card[]cardsAtPosition=新卡[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];
   }
}
public void setCardsAtEachPosition(卡片[]值设置){
//检查valuesToSet是否有所需的卡数
对于(i=0;i
您需要放弃getter/setter对,使用
列表来存储您的对象,而不是尝试将所有内容都塞进一个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));
        }
    }
import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
公开课Foo{
公共静态类卡{
int-val;
公共卡(int val){
this.val=val;
}
公共int getVal(){
返回val;
}
}
公共静态阶级立场{
int值;
公共职位(卡片){
this.value=card.getVal();
}
}
公共静态void main(字符串[]args){
列表卡=新的ArrayList(Arrays.asList(新卡(1)、新卡(2)、新卡(3));
列表位置=新的ArrayList();
用于(卡片:卡片){
职位。新增(新职位(卡片));
}
}

}

这是一个简单的代码片段,演示了如何使用反射循环特定对象的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
            }
    }
}

正如其他人所说,它可能不是一个优雅的实现。这只是为了完整性。

+1:您想这样设置值的事实表明,为每个特定值设置一个set/get并不是一个适合您需要的好设计。重构函数以采用整型参数是最正确的。在地球上,有两组12个几乎相同的函数是没有意义的。我同意这似乎是一个糟糕的设计。最有可能的是
pos
card
是集合或数组,因此带有附加索引的getter和setter会更好。啊,从来没有想过这一点。谢谢你的提示。在第一次看到反射后,我同意这是用大炮向麻雀射击(正如德国所说)。@baphomet13-我想你已经看到了: