Если ( большой если), то это действительно необходимо (подумайте, что сначала) ...
Общая идея, к которой вы стремитесь, может сработать, но ваш код сбивает с толку и, на мой взгляд, на первый взгляд, в любом случае кажется, что он может не сработать. Этот тип сложности, который может сломать вещи, является очень веской причиной для двоякого и даже тройного мышления, идущего по этому пути.
Основная проблема, которую я сразу заметил, заключается в том, что вы создаете только один экземпляр объекта. Если это фабрика, которая просто создает вещи в другом потоке, то DedicatedThread
должен вызываться в DedicatedThreadBuilder
constructObject
, а не в его конструкторе.
Если, с другой стороны, вы на самом деле намереваетесь для DedicatedThreadBuilder
создать только 1 экземпляр T
, тогда эта абстракция кажется ненужной ... просто переместите поведение DedicatedThread
в DedicatedThreadBuilder
, поскольку DedicatedThreadBuilder
на самом деле, кажется, не делает ничего лишнего.
Во-вторых, второстепенная вещь, которая не является неправильной настолько, насколько это просто не нужно: у вас есть внутренний класс, который вы передаете экземпляру внешнего класса его конструктору (то есть * 1023) Конструктор * принимает ссылку на своего родителя DedicatedThreadBuilder
). В этом нет необходимости, поскольку нестатические внутренние классы уже связаны с их внешними классами, поэтому внутренний класс может ссылаться на внешний класс без какой-либо дополнительной ссылки на него.
В-третьих, если вы переместите поведение из конструктора в отдельный метод, вы можете синхронизировать это. Лично я хотел бы, чтобы constructObject
был тем, что запустило процесс, чтобы вызов dtb.constructObject()
начал создание объекта, а constructObject
сам установил object = newlyCreatedThing
, когда это было сделано. Тогда вы можете синхронизировать этот метод, если хотите, или делать все что угодно, и вам не нужно беспокоиться о том, что конструктор может вести себя не так, как вы хотите - на мой взгляд, вам не следует беспокоиться о том, что конструктор может иметь некоторые странные побочные эффекты.
В-четвертых, есть ли у вас какой-нибудь способ узнать, когда объект готов и доступен для получения? Возможно, вы захотите добавить какой-то механизм для этого, например, наблюдателя или другой обратный вызов.