【问题标题】:Single getter function for multiple/all variables/collections用于多个/所有变量/集合的单个 getter 函数
【发布时间】:2018-09-05 22:02:00
【问题描述】:

是否可以构建一个接受任何字符串并返回相应变量/集合的函数?我在一个班级大约有 54 个私人收藏,我需要从另一个班级阅读。所需集合的名称是已知的。最简单的方法是将每个集合设置为公开,但我认为原始创建者确实将它们设置为私有是有原因的。由于它们太多了,我懒得通过专用的吸气剂或使用开关功能来访问它们。

编辑:我没有使用普通的 GUI Java 开发环境。我正在使用 AnyLogic 软件,它没有用于创建 getter/setter 的菜单。

【问题讨论】:

  • 您可以将集合放在特定名称(键)下的 Map 中。然后您通过这些名称(键)访问它们。没有具体的用例,很难说。
  • 是的,使用反射
  • 为什么一个类有54个集合?

标签: java anylogic


【解决方案1】:
  1. a) 在 AnyLogic 中,为此目的有一个特殊功能:
    executeExpression( Class<T> returnType, String code )
    要访问任何集合,您可以使用这样的代码:
    executeExpression( List.class, "collectionName" ).get( 0 )

    b) 该函数仅适用于公共变量,因此如果您定义 收藏为公开,您将能够使用该功能。

  2. 如果集合被声明为代理参数,您可以 使用函数以类似的方式访问它们 getParameter(java.lang.String name)

  3. Getter 和 Setter 可以在 Eclipse 中生成,只需将类代码复制粘贴到 Ecipe,生成它们,然后将代码复制粘贴回 AnyLogic 类代码。

【讨论】:

    【解决方案2】:

    如果您在 AnyLogic 类中有 54 个集合,您确实应该考虑重构您的底层结构。一些替代方案:

    • 考虑一个集合数组(或集合集合)。如果您设置常量(静态最终 int),那么您可以轻松地说 arrayCollection[CONSTANT]。例如,这可以是 arrayWidgetsInProgess[ PRODUCT_A ] 来获取产品 A 类型的小部件的集合。
    • 只考虑一个集合并使用 lambda 表达式即时获取您感兴趣的对象。在 AnyLogic 中可能是过滤器(collection, agent -> agent.attribute == attributeWeWant)。

    我真正需要这么多集合的唯一一次可能是允许用户通过前端定义某些东西的情况。例如,如果我有一个产品类型完全由用户定义的模型,它们可能有 10 或 100 个产品类型。在这种情况下,我倾向于使用集合或数组或集合的集合。集合的集合可以是arrayLists的arrayList、arrayList的hashMap、hashMaps的hashMap……

    您应该准备在类启动时或在其他代码中对集合集合/集合数组进行一些实例化。 AnyLogic 的画布将允许您创建一个集合数组,但是您需要在数组中实际实例化这些集合。

    【讨论】:

    • 这是个好主意,但是这些集合的一部分不是我制作的,此时重组集合会使整个逻辑出错。我一直在寻找一种不那么深刻的方法,但似乎公开收藏是最简单的方法。
    【解决方案3】:

    简答

    不要再做一个懒惰的傻瓜,而是创造二传手。 每个 GUI Java 开发环境都支持在菜单中进行此操作。

    还是很懒

    使用反射访问类并通过名称获取私有字段。 尝试阅读Java Class JavaDoc page

    Google 很乐意提供使用反射的代码示例。 搜索选项包括, 但不限于: 《Java 反射教程》和《Java 反射示例》。

    【讨论】:

      猜你喜欢
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多