Можно ли зациклить сеттеры и геттеры? - PullRequest
4 голосов
/ 13 октября 2011

Я вполне уверен, что это никак не сработает, но я все равно хотел спросить, на случай, если я ошибаюсь:

Я много раз слышал, что всякий раз, когда у вас есть определенное количество строк очень похожего кода в одном пакете, вы всегда должны проходить через них.

Скажем, у меня есть что-то вроде следующего.

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 ]

10 голосов
/ 13 октября 2011

Нет способа сделать это специально на Java без размышлений, и я не думаю, что это того стоит.Это больше похоже на сигнал о том, что вы должны реорганизовать функцию getcard, чтобы получить целочисленный аргумент.Тогда вы могли бы зациклить.

3 голосов
/ 13 октября 2011

Вы можете сделать это с помощью отражения, но это будет громоздко.Лучшим подходом может быть создание общих методов setPos () и getCard (), в которые можно передать индекс текущего элемента.

2 голосов
/ 21 июня 2015

Это простой фрагмент, который показывает, как пройти через геттеры определенного объекта, чтобы проверить, являются ли возвращенные значения нулевыми, используя отражение:

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

Как и другие, возможно, этоэлегантная реализация.Это просто ради полноты.

2 голосов
/ 13 октября 2011

Вам нужно отбросить пары геттер / сеттер и использовать 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 голос
/ 13 октября 2011

Вы не можете динамически создать имя метода и затем вызывать его (без отражения). Даже с отражением это было бы немного хрупко.

Один из вариантов - объединить все эти операции в один метод, такой как 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 голосов
/ 13 октября 2011

Отражение будет вашим единственным вариантом для вашего примера.

...