0

我有一个方法

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调用中显式键入参数,而是允许我简单地引用方法自己的参数?

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

请注意,参数的类型不同,它们仍应定义为 such 而不是Object... args.

4

2 回答 2

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 来保持它不可变。有时,如果它纯粹是一种方便的数据结构,您可能会为实例成员使用公共,但任何体面的 IDE 都可以为您自动生成访问器(如果您使用公共,您会final因为不变性而陷入困境)。

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

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

于 2013-03-11T18:22:56.103 回答
1

可以使用反射,并且如果您的代码是在启用调试的情况下编译的;请参阅以下答案:我可以使用 Java 反射获取方法参数名称吗?

于 2013-03-11T18:24:33.903 回答