Вызов методов во время вызова конструктора - PullRequest
1 голос
/ 12 октября 2011

Я просматривал учебные пособия по разработке для Android и вижу множество звонков, подобных этому:

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

Похоже, это хороший способ записи, но действительно ли это хорошая практика?Будет ли это иметь негативные побочные эффекты?

Ответы [ 5 ]

6 голосов
/ 12 октября 2011

Это называется свободный интерфейс .

Код не вызывает методы во время вызова конструктора.Он вызывает методы объекта, возвращаемого конструктором, после , когда конструктор завершил.

Каждый из этих вызовов метода заканчивается return this, и это ключ.Это то, что позволяет объединять вызовы.

4 голосов
/ 12 октября 2011

Да, это нормально, но не совсем понятно, о чем вы беспокоитесь.Если вы думаете, что это вызывает метод 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 голосов
/ 12 октября 2011

Отрицательные побочные эффекты включают в себя:

  • Значительно выше WTF в секунду
  • Злые коллеги-программисты
  • Гораздо сложнее читать код

При этом ... бывают случаи, когда некоторые методы в вашем коде могут почти всегда вызываться немедленно, что имеет смысл. Если вы влюблены в это, я бы определенно сказал, что не более 1 дополнительного вызова метода, но в целом я все равно рекомендовал бы это.

1 голос
/ 12 октября 2011

Никаких негативных побочных эффектов, только затрудняет чтение. Многие разработчики придерживаются практики «чем меньше кода, тем лучше».

0 голосов
/ 12 октября 2011

Свободный интерфейс или нет, в этом случае я бы предпочел что-то вроде:

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

Короче, лучше читать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...