Многие Builder Patternпримеры делают Builderвнутренний класс объекта, который он создает.
Это имеет некоторый смысл, поскольку указывает на то, что Builderстроит. Однако в статически типизированном языке мы знаем, что Builderстроит.
С другой стороны, если Builderэто внутренний класс, вы должны знать, какой класс Builderстроит, не заглядывая внутрь Builder.
Кроме того, наличие конструктора в качестве внутреннего класса уменьшает количество импортов, так как на него может ссылаться внешний класс - если вы заботитесь об этом.
И затем есть практические примеры, когда Builderобъект находится в одном пакете, но не во внутреннем классе, например StringBuilder. Вы знаете, что Builder должен построить, Stringпотому что он назван так.
При этом единственная причина, по которой я могу придумать создание Builderвнутреннего класса, состоит в том, что вы знаете, что такое класс « Builder, не зная его имени и не полагаясь на соглашения об именах. Например, если бы это StringBuilderбыл внутренний класс, Stringя, вероятно, знал бы, что он существует раньше, чем я (умозрительный).
Есть ли другие причины делать Builderвнутренний класс или он просто сводится к предпочтениям и ритуалам?