コード例 #1
0
  public void createFactoryMethod(boolean hasSingletonScope) {

    AbstractJClass narrowedGeneratedClass =
        codeModelHelper.narrowGeneratedClass(generatedClass, annotatedElement.asType());

    JMethod factoryMethod =
        generatedClass.method(PUBLIC | STATIC, narrowedGeneratedClass, GET_INSTANCE_METHOD_NAME);

    codeModelHelper.generify(factoryMethod, annotatedElement);

    JVar factoryMethodContextParam = factoryMethod.param(getClasses().CONTEXT, "context");

    JBlock factoryMethodBody = factoryMethod.body();

    /*
     * Singletons are bound to the application context
     */
    if (hasSingletonScope) {

      JFieldVar instanceField =
          generatedClass.field(PRIVATE | STATIC, generatedClass, "instance" + generationSuffix());

      JBlock creationBlock =
          factoryMethodBody //
              ._if(instanceField.eq(_null())) //
              ._then();
      JVar previousNotifier = viewNotifierHelper.replacePreviousNotifierWithNull(creationBlock);
      creationBlock.assign(
          instanceField,
          _new(narrowedGeneratedClass)
              .arg(factoryMethodContextParam.invoke("getApplicationContext")));
      creationBlock.invoke(instanceField, getInit());
      viewNotifierHelper.resetPreviousNotifier(creationBlock, previousNotifier);

      factoryMethodBody._return(instanceField);
    } else {
      factoryMethodBody._return(_new(narrowedGeneratedClass).arg(factoryMethodContextParam));
    }
  }