我一直在浏览Android开发教程,我看到很多这样的调用:
String date = new StringBuilder().append(mMonth + 1).append("-").append(mDay).append("-").append(mYear).append(" "));
似乎是一种很好的速记方式,但这真的是一种很好的做法吗?这会产生任何负面影响吗?
答案 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)
负面影响包括:
话虽如此......有些情况下,代码中的某些方法几乎总是可以立即被调用,这是有意义的。如果你喜欢这样做,我肯定会说一个额外的方法调用,但总的来说我仍然会建议反对它。
答案 3 :(得分:1)
没有负面影响,只是让它更难阅读。许多开发人员都采用“代码越少越好”的做法。
答案 4 :(得分:0)
流畅的界面与否,在这种情况下,我更喜欢这样的东西:
String date = String.format("%d-%d-%d ", mMonth+1, mDay, mYear);
更短,更好阅读。