【问题标题】:Write array as parameter Java将数组作为参数写入 Java
【发布时间】:2018-05-29 18:26:34
【问题描述】:

我希望能够将数组直接写为我的方法的参数,而不是将数组值存储在单独的变量中。

例子:

public void myMethod(myObject[] objParam, String[] strParam, Integer[] intParam) {
    // do stuff
}

我想这样调用方法:

myMethod({obj1, obj2}, {"string1","string2"}, {123,456});

目前这在我的 IDE 中是不可接受的,我尝试了不同的符号,甚至转换为数组,但没有任何效果。

我不想每次需要使用我的方法时都为每个参数声明和启动一个数组。

有没有人知道一个好的解决方法?使用 List 是一种解决方案吗?

编辑:参数类型是固定的,数组值将对应于 3 个参数中的每一个的 1 到 1。

【问题讨论】:

  • new Object[]{obj1, obj2} 应该这样做,或者这正是您首先要避免的?恐怕没有更短的方法可以在 Java 中指定一个数组。而且 List/Set/Map 更加冗长。
  • myMethod(new myObject[]{obj1, obj2}, new String[]{"string1","string2"}, new Integer[]{123,456});?
  • “我不想为每个参数声明和启动一个数组”,你想传递 3 个数组参数,我想必须初始化他们是故事的一部分。
  • 如果您知道值,为什么不直接在代码中输入它们?
  • 您的评论表明这个问题可能是X/Y problem的又一个案例。

标签: java arrays parameters casting parameter-passing


【解决方案1】:

我能想到的最短的方法是准备这样的课程:

public class ArrUtil {
    public static Integer[] arr(Integer... elements) {
        return elements;
    }

    public static String[] arr(String... elements) {
        return elements;
    }

    public static myObject[] arr(myObject... elements) {
        return elements;
    }
}

然后就可以静态导入arr了:

import static ArrUtil.*;

并像这样使用它:

myMethod(arr(obj1, obj2), arr("abc", "Def"), arr(1, 2));

编辑:您说这些值是相关的。更简洁的解决方案是声明一个容器类:

class Foo {
    final myObject obj;
    final String str;
    final int num;

    Foo(myObject obj, String str, int num) {
        this.obj = obj;
        this.str = str;
        this.num = num;
    }

    static Foo Foo(myObject obj, String str, int num) {
        return new Foo(obj, str, num);
    }
}

然后你可以带一个可变参数:

void myMethod(Foo... foos) {
}

然后调用它

myMethod(Foo(obj1, "abc", 123), Foo(obj2, "def", 234)) 

【讨论】:

  • 是的,实际上这看起来确实是一个更优雅的解决方案,但它增加了抽象层。谢谢!
【解决方案2】:

要内联初始化数组,还需要指定类型,如下所示:

myMethod(new myObject[]{obj1, obj2},
        new String[]{"string1", "string2"},
        new Integer[]{123, 456}
);

【讨论】:

  • 如果“obj1”和“obj2”是在函数调用之前已声明的“myObjects”类型的两个对象,则此方法有效。如果您希望在此函数调用中创建所有内容,则必须使用 new myObject[]{new myObject(), new myObject()}
  • 谢谢,这解决了问题,代码至少可以编译,但我得想个更优雅的写法。也许在方法中传递字符串并解析它们中的每一个。
  • @SorinD。 “我不想每次需要使用我的方法时都为每个参数声明和启动一个数组。”但是您接受了答案,这正是您想要避免的。 new Type[]{elements, ...}初始化一个数组,每组参数都需要这样做。
  • 虽然这会编译,但鉴于我们所知道的,即 Pshemo 在上面确认的内容,我发现下面的 xs0 可以为您的问题提供最优雅和最相关的方法 ^
  • @Pshemo 这个答案没有声明任何数组。我假设最初的问题是想避免变量声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 2016-06-09
  • 1970-01-01
相关资源
最近更新 更多