在构造函数调用期间调用方法

时间:2011-10-12 19:30:07

标签: java coding-style

我一直在浏览Android开发教程,我看到很多这样的调用:

String date = new StringBuilder().append(mMonth + 1).append("-").append(mDay).append("-").append(mYear).append(" "));

似乎是一种很好的速记方式,但这真的是一种很好的做法吗?这会产生任何负面影响吗?

5 个答案:

答案 0 :(得分:6)

它被称为fluent interface

代码在调用构造函数期间不调用方法。它调用构造函数返回的对象上的方法,构造函数完成后

每个方法调用都以return this结束,这就是关键。这就是允许将呼叫链接在一起的原因。

答案 1 :(得分:4)

是的,那没关系 - 但目前尚不清楚你在关注什么。如果您认为在append构造函数中调用StringBuilder方法,则不是。此代码等同于:

StringBuilder tmp = new StringBuilder();
tmp = tmp.append(mMonth + 1);
tmp = tmp.append("-");
tmp = tmp.append(mDay);
tmp = tmp.append("-");
tmp = tmp.append(mYear);
tmp = tmp.append(" ");
String date = tmp.toString();

append的每次调用实际上都会在this中返回StringBuilder,但在其他类似的API中,对象可能是不可变的,每个方法都会构建一个 new 对象并返回......调用代码看起来是一样的。

(我假设真正的代码有一个toString调用,当然,否则就不会编译。)

请注意,这实际上相当于:

String date = (mMonth + 1) + "-" + mDay + "-" + mYear + " ";

...它比原始代码更具可读性,并且做同样的事情。无论如何,Java编译器将使用StringBuilder。当然,您应该使用SimpleDateFormat或Joda的DateTimeFormatter格式化日期,当然......

答案 2 :(得分:2)

负面影响包括:

  • 每秒显着更高的WTF
  • 愤怒的同事程序员
  • 更难阅读代码

话虽如此......有些情况下,代码中的某些方法几乎总是可以立即被调用,这是有意义的。如果你喜欢这样做,我肯定会说一个额外的方法调用,但总的来说我仍然会建议反对它。

答案 3 :(得分:1)

没有负面影响,只是让它更难阅读。许多开发人员都采用“代码越少越好”的做法。

答案 4 :(得分:0)

流畅的界面与否,在这种情况下,我更喜欢这样的东西:

String date = String.format("%d-%d-%d ", mMonth+1, mDay, mYear);

更短,更好阅读。