【问题标题】:Passing field name as an argument to a method in the same class in Java将字段名称作为参数传递给Java中同一类中的方法
【发布时间】:2018-11-15 06:45:12
【问题描述】:
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)方法,通过传递字段作为方法对的参数。这部分是出于好奇,但也是为了减少对象有很多字段的情况下的样板代码,每个字段都有自己的 getter/setter。我正在制作的代码已在上面的 sn-p 中抽象出来,以显示我希望完成的工作。如果需要任何额外的细节或澄清,或者任何看起来模棱两可的地方,请随时询问。

我知道上面的代码相当荒谬,并且可能更像伪代码而不是 java,因为我认为上面的代码根本不起作用。但是有什么与上述类似的可能吗?我是 Java 新手,所以对它的特性和限制不是很熟悉。我知道在 C 中可以使用指针进行类似的操作?

无论如何,对于冗长的文字感到抱歉,并提前致谢!任何意见都是有价值的,非常感谢。

【问题讨论】:

    标签: java methods parameter-passing


    【解决方案1】:

    不要这样做。

    如果一个类有很多 getter,那么它的设计就很糟糕。

    您实际上将对象视为名称到值的Map。也许您的用例实际上是您需要从名称到值的Map

    【讨论】:

    • 谢谢!这是我第一次听说Map!它看起来很有趣,但它只能存储两个值,一个键值对,对吧?是否可以将字符串数组作为值放入 hexmap 中,使其充当表,而键充当行的主键?因此,每个“行”都可以模拟当前实现的对象的一个​​实例,该实例存储多个字符串?
    • 但是迭代它需要将其转换为一个集合,这不允许重复值,对吧?那么((StringA != StringB) && (StringB != StringC) && (StringC != StringA))如果循环访问呢?
    【解决方案2】:

    我也同意@Raedwald 的观点,即过多的字段可能表明存在设计缺陷。也就是说,有更简单的替代方法可以减少代码,而不是像您的帖子所建议的那样通过反射访问字段。

    另一种方法是添加像Lombok 这样的库,如果将特殊注释应用于字段、类、方法等,它会在编译期间注入代码。

    例如@lombok.Data注解会自动为你创建getter、setter、toString、构造函数、hashcode和equals。例如

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

    然后您可以像这样访问字段a

    largePojo.getA()
    

    【讨论】:

    • 不幸的是,出于这个项目的目的,我不允许使用外部库。不过,这似乎真的很有趣且可行!在我的研究中,我确实多次遇到过反射这个词。这将如何运作?
    • @Terrornado 反射 API 让您可以动态检查 Class 的结构。您可以确定有关如何编写类的字段、方法和许多其他信息。这些 API 可用于编写一些非常 hacky 的代码,因为它们可以让您以类作者不打算的方式修改对象。我不建议此时使用反射。如果不小心使用,它会大大减慢您的代码并容易出错。如果我处于你的位置,我会接受打击并以正常的风格编写课程,即使有额外的样板代码。
    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2014-02-09
    • 2012-03-15
    相关资源
    最近更新 更多