【问题标题】:Reference a method's parameters in one variable在一个变量中引用方法的参数
【发布时间】:2013-03-11 18:19:49
【问题描述】:

我有一个方法

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

【问题讨论】:

    标签: java methods parameters reference


    【解决方案1】:

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

    例如:

    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 进行链接。这可以帮助避免迷失在构造函数签名中(“是xyz 还是xzy...?”)。 :-) 这样做的缺点是你基本上失去了不变性。

    【讨论】:

    • 所有这些变量最终都会导致对象的创建。但是,输入参数的验证将仅在最后一个管理类中完成,以维护其特定任务。使用这些变量创建对象会绕过这一点,这是不受欢迎的行为。
    • @JeroenVannevel:没必要。如果你愿意,你可以在最后验证它们,基本上把这个类当作一个消息信封。
    • 在这种特定情况下,将创建一个对象并将其添加到数据库中。您是否建议我将其添加到数据库中,对其进行验证并在必要时将其删除?
    • @JeroenVannevel:不,一点也不。你说过你经常传递这些东西,而且很乱。我是说您可以通过将它们放入信封中来更干净(当然更简洁)地做到这一点。在完全您将验证 xy 等作为离散参数的相同位置,您可以验证 nifty.xnifty.y 等。除了您如何在您的代码周围移动该数据。 (也就是说,没有必须有所不同;如果您愿意,肯定有机会走得更远。)
    • 出于通常的原因,我会将其设为不可变的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-04
      • 2012-03-07
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多