在一个变量中引用方法的参数

时间:2013-03-11 18:19:49

标签: java methods parameters reference

我有一个方法

public void create(String x, String y, String z, Calendar a, Calendar b, Calendar c, List<String> d){
    object.create(x, y, z, a, b, c, d);
}

通过一些管理类传递。有没有办法避免我必须在object.create调用中明确键入参数,而是允许我简单地引用方法自己的参数?

我问这个的原因是因为我有几种这样的方法,看起来很混乱。

请注意参数属于不同类型,但仍应按此定义,而不是Object... args

2 个答案:

答案 0 :(得分:5)

这里通常的答案是创建一个具有这些东西属性的新类,并传递该类的实例(有点像消息包络)而不是一堆离散的参数。

例如:

public void create(MyNiftyThing thing){
    object.create(thing);
}

... MyNiftyThing类的位置是:

class MyNiftyThing {

    private String x;
    private String y;
    private String z;
    private Calendar a;
    private Calendar b;
    private Calendar c;
    private List<String> d;

    public MyNiftyThing(String x, String y, String z, Calendar a, Calendar b, Calendar c, List<String> d) {
        // ...init data members here...
    }

    // ...accessors for the data members here...
}

只有拥有getter而不是setter才能让它保持不变。有时候,如果它是 纯粹 一个便利数据结构,你可以使用public作为实例成员,但任何体面的IDE都可以为你自动生成访问器(如果你使用的话)公众,你会被final置于不可变性之中。

当然,如果你能提供合理的默认值,你 不接受构造函数中的所有构造函数(或者你可以有多个构造函数)。

它可能不适用于这种特定情况,但是例如MyNiftyThing可以是它自己的构建器,通过让构造函数接受最小的args(可能没有),然后是一系列buildNNN方法设置其相关数据成员并返回this进行链接。这可以帮助避免迷失在构造函数签名中(“是xyzxzy。 ..?“)。 :-)这样做的缺点是你基本上失去了不变性。

答案 1 :(得分:1)

可以使用反射,如果您的代码是在启用调试的情况下编译的;请参阅以下答案:Can I obtain method parameter name using Java reflection?