Передача имени поля в качестве аргумента методу того же класса в Java - PullRequest
0 голосов
/ 15 ноября 2018
public class ConstructorA {
  private String FieldA, FieldB, FieldC;
  public String Setter(String ArgAA, String ArgAB) {
      this.ArgAA = ArgAB;  //or ArgAA could include "this."
  }
  public String Getter(String ArgBA) {
      return ArgBA;
  }
ObjectA = new ConstructorA();
ObjectA.Setter(FieldA, "TextA");
ObjectA.Setter(FieldB, "TextB");
ObjectA.Setter(FieldC, "TextC");
System.out.printf("%s %s %s", ObjectA.Getter(FieldA), ObjectA.Getter(FieldB), ObjectA.Getter(FieldC));

Я пытаюсь создать универсальные методы setter и getter (mutator и accessor), которые могли бы назначать и извлекать значения в поля и из полей без определенной пары таких методов для каждого отдельного поля, передавая имя поле в качестве аргумента в пару методов. Отчасти это связано с любопытством, а также с уменьшением стандартного кода для случаев, когда объекты имеют много полей, каждое из которых имеет свой собственный метод получения / установки. Код, который я делаю, был абстрагирован в приведенном выше фрагменте, чтобы показать, чего именно я хочу достичь. Если вам нужны какие-либо дополнительные детали или разъяснения или что-то кажется неоднозначным, пожалуйста, не стесняйтесь спрашивать.

Я понимаю, что приведенный выше код довольно нелепый и, скорее всего, напоминает псевдокод больше, чем java, так как я думаю, что выше не будет работать вообще. Но возможно ли что-нибудь похожее на вышесказанное? Я новичок в Java и не очень знаком с ее функциями и ограничениями. Я так понимаю, что подобное было бы возможно в C, используя указатели?

Во всяком случае, извините за длинный текст, и заранее спасибо! Любой вклад является ценным и высоко ценится.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Я также согласен с @Raedwald, что слишком много полей могут указывать на возможный недостаток дизайна. Тем не менее, существуют более простые альтернативы сокращению кода, а не доступу к полям с помощью рефлексии, как предлагает ваш пост.

Одной из альтернатив является добавление библиотеки, подобной Lombok , которая внедряет код во время компиляции, если к полям, классам, методам и т. Д. Применяются специальные аннотации

Например, аннотация @lombok.Data создаст для вас getter, setters, toString, constructors, hashcode и equals. например,

@lombok.Data
public class LargePojo {
    private String a;
    private int b;
    private List<String> c;
}

Затем вы можете получить доступ к полю a следующим образом:

largePojo.getA()
0 голосов
/ 15 ноября 2018

Не делайте этого.

Если в классе много получателей, он плохо спроектирован.

По сути, вы рассматриваете объект как Map имен значений.Возможно, ваш вариант использования на самом деле , что вам нужно Map от имен до значений?

...