在运行时传递可选的未知参数

时间:2017-10-11 20:33:17

标签: java oop optional-parameters

假设我有一个带2个参数的方法

public Class Test{
        public void Foo(int x, SOMETHING HERE(Optional and unknown at runtime)){

        }
}

在我的主要

public Class Main{
    public static void main(String[]args){
    Test test = new Test();
    String s1 = "Hello";
    float f1 = 5.5f;

    test.Foo(10);
    test.Foo(10, s1);
    test.Foo(10, f1);
    test.Foo(10, s1, f1);
    test.Foo(10, f1, s1);
    }
}

如何在不创建多种方法的情况下实现我想要的目标?

2 个答案:

答案 0 :(得分:1)

当第一个int参数之后的参数数量未定义时&它们可能有不同的类型,您可以使用varargs方法签名

public Class Test{
   public void Foo(int x, Object... args) {

   }
}

此方法的唯一问题是您需要在Foo方法

中仔细处理参数

对于前。迭代参数你可以使用循环并检查类型实例:

for (Object item : args) {
   if (item instanceof String) {
      // do stuff
   }
}

另一种方法是获得参数长度&逐个获取他们的特定值:

final int maxArgs = args.length;
if (maxArgs > 0) {
    final Object arg0 = args[0];
    if (arg0 instanceof String) {
        final String strArg0 = (String) arg0;
        //do stuff
    }
}

基本上取决于您的要求

答案 1 :(得分:0)

我还不能发表评论,所以我会提供一份初步答案,说明你目前所提供的资料,但我认为需要澄清。

正如人们已经说过的,这个问题似乎与java可选参数有关(特别是:Object的varargs)。考虑你的例子(main())我也会选择一系列重载方法,但它在很大程度上取决于你期望带来的不同可选参数的数量以及可能发生的任何参数排序冲突。

其他替代方案包括为您的论点定义一个界面" SOMETHING_HERE"可以在运行时以任何可能的方式填充(也可以匿名使用)。所以在其他方面(比如使用变量类型args的地图),你最终可以这样做:

EG。

  

public interface IDynLoadedArgs { public Float getFloat(); // returns NULLABLE public String getString(); // returns NULLABLE }

public Class Test{
    public void foo(int x, IDynLoadedArgs args){
        ...
    }
}

public Class Main{
    public static void main(String[]args){
        Test test = new Test();
        final String s1 = "Hello";
        final float f1 = 5.5f;

        test.foo(10, null); // = might equal test.foo(10);
        test.foo(10, new IDynLoadedArgs() {
            public Float getFloat(){
                return null;
            }
            public String getString(){
                return s1;
            }
        });    // = might equal test.foo(10, s1);
        test.foo(10, new IDynLoadedArgs() {
            public Float getFloat(){
                return f1;
            }
            public String getString(){
                return null;
            }
        });    // = might equal test.foo(10, f1);
        test.foo(10, new IDynLoadedArgs() {
            public Float getFloat(){
                return f1;
            }
            public String getString(){
                return s1;
            }
        });    // = might equal test.foo(10, f1, s1);
        ...
    }
}

当然,您可以在调用" foo"之前以经典方式实例化IDynLoadedArgs对象。 (因此避免了匿名事件的副作用并使这些对象可以重复使用..

然而,只要你在原始问题中没有准确地说明顺序很重要以及你对方法有什么样的待遇,那么就很难提出一些绝对合适的方法。如果可能请澄清。