【问题标题】:Iterating through method parameters遍历方法参数
【发布时间】:2011-05-23 10:11:49
【问题描述】:

这是一个简单且可能微不足道的问题:在 Java 中,我如何迭代传递给我正在工作的方法的参数?

我需要它来trim()所有这些都是字符串。

编辑

更准确地说可以这样使用示例(用伪代码编写,反映我希望它如何工作):

public void methodName(String arg1, int arg2, int arg3, String arg4, double arg5)
    for(Object obj : getThisMethod().getParameters() )
        System.out.println(obj.getName() + " = " + obj.toString())

重点是getThisMethod().getParameters()。我必须在那个地方写什么?

【问题讨论】:

  • 你的方法声明是什么样子的?
  • 为什么需要它们?如果您知道参数的名称,那么您可以在方法的最顶部执行此操作。
  • 我的方法是一个包含许多字段的简单构造函数,但这个问题对任何方法都有效,我想对所有参数做一些事情。编写简单而优雅的代码而不是每次添加/修改/删除参数时都更改它会很有用。

标签: java parameters methods


【解决方案1】:

如果您的函数使用Varargs,这非常简单:

private void yourFunction(String... parameters) {
  for (String parameter : parameters) {
    // Do something with parameter
  }
}

【讨论】:

  • ...只要 OP 谈论的字符串 应该 被视为一个组。 OP 不应该仅仅为了能够方便地迭代它们而将它们打包在一起。
  • 我不能使用这个,因为我的参数需要一个不同的名字。使用数组或类似的东西会使情况复杂化。
【解决方案2】:

单个参数不可迭代;你需要一个收藏品。

如果它们是单独的字符串,你只需要得到一把铲子。

如果你有这么多 String 参数,这很压抑,也许你的方法需要重新考虑。要么所有这些参数都应该封装到一个对象中,因为它们是相关的,要么该方法试图做太多事情。这说明我缺乏凝聚力。

【讨论】:

  • 谢谢!因为现在你的答案似乎是最正确的,即使幻想破灭:) 但是我的方法是一个构造函数,我将许多必须保存在数据库记录中的字段传递给它。我想知道:什么是“铲子”?从来没有听说过它与 Java 相关..
  • “get a shovel”是一个表达方式,意思是“卷起袖子开始工作”。当开发人员面临需要长时间努力和耐心而不是脑力的大而繁琐的任务时,通常会出现这种情况。
【解决方案3】:

您尝试解决的任务只能使用 AOP(面向方面​​编程)框架。

AOP 框架允许您在不更改方法的情况下向方法中添加一些代码。实际上,它们会创建代理类,这些代理类会包装您的原始类,并在您绑定它们的每个方法之前执行所需的代码行。

但是,AOP 对于一些简单的任务来说是多余的,因为它通常需要一些复杂的配置并且通常与 DI 框架集成。

如果您仍然感兴趣,这里有一些 AOP 框架列表:http://java-source.net/open-source/aspect-oriented-frameworks

编辑:

实际上,我认为您首先以错误的方式执行任务。如果您的方法是业务层的一部分 - 它不应允许未修剪的参数并在这种情况下抛出某种异常。如果您的方法是某个表示层的一部分 - 它应该手动清理参数,通常靠近它从用户读取参数的部分。

例如,如果您正在从某个 Swing 表单中读取该参数,那么您应该在传递给您的构造函数之前修剪它们。例如:

您当前的代码:

int someId = Integer.valueOf(idField.getText());
String someName = nameField.getText();
String someArg = argField.getText();
new Constructor(someId, someName, someArg)

应该如何处理:

int someId = Integer.valueOf(idField.getText());
String someName = nameField.getText().trim();
String someArg = argField.getText().trim();
new Constructor(someId, someName, someArg)

【讨论】:

  • 您的编辑部分是一个很好的观察,谢谢!但是我想找到一种方法来完全按照我所说的去做......这就像对 Java 的挑战;)
  • 好吧,如果你想简单的话——Java 做不到。您不能迭代方法参数。此外,您也不能通过反射访问局部变量。所以你唯一能做的就是 AOP 或类似的东西,它可以控制对类的特定方法的所有调用。
【解决方案4】:

因为您可以将您的方法更改为以下您可以迭代它们。

public void method(String... args)

【讨论】:

  • ...只要 OP 所讨论的字符串应该被视为一个组。 OP 不应该仅仅为了能够方便地迭代它们而将它们打包在一起。
  • 稍微好一点但也非常失败的解决方案是传递参数映射并对其进行迭代:)
  • @Bert,这是真的。但是需要 trim() 所有字符串建议它可能是一组字符串。
  • 绝对同意——你的答案不是一无是处——你打败了我,得到了同样的答案:)。我只是想为一个可能过于热心的 OP 贡献一份考虑。
  • @Bert,值得一提。
【解决方案5】:

如果您的问题是如何从对象中识别字符串,您可以这样做:

if (myObject instanceof String) {
  // My param is a string!
}

【讨论】:

    猜你喜欢
    • 2017-12-07
    • 2012-07-14
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2021-09-07
    • 2014-05-13
    相关资源
    最近更新 更多