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-我想你已经看到了: