Можем ли мы иметь непубличные константы в BuildConfig? - PullRequest
0 голосов
/ 15 мая 2019

Я пишу библиотеку для Android и хотел, чтобы она использовала только константы в BuildConfig - так что клиент lib, так сказать, не увидит их легко.

Итак, чего бы я хотел достичь, так это вместо публичной константы, такой как:

package my.lib;

public final class BuildConfig {
    public static final boolean FOO = false; 
}

он скорее сгенерирует константу без модификатора доступа, что сделало бы материал видимым в пакете моей библиотеки:

package my.lib;

public final class BuildConfig {
    static final boolean FOO = false; 
}

Можно ли как-то добиться? Спасибо!

1 Ответ

1 голос
/ 15 мая 2019

Это generate() метод из BuildConfigGenerator класса:

/**
 * Generates the BuildConfig class.
 */
public void generate() throws IOException {
    File pkgFolder = getFolderPath();
    if (!pkgFolder.isDirectory()) {
        if (!pkgFolder.mkdirs()) {
            throw new RuntimeException("Failed to create " + pkgFolder.getAbsolutePath());
        }
    }
    File buildConfigJava = new File(pkgFolder, BUILD_CONFIG_NAME);
    FileWriter out = new FileWriter(buildConfigJava);
    JavaWriter writer = new JavaWriter(out);
    Set<Modifier> publicFinal = EnumSet.of(Modifier.PUBLIC, Modifier.FINAL);
    Set<Modifier> publicFinalStatic = EnumSet.of(Modifier.PUBLIC, Modifier.FINAL, Modifier.STATIC);
    writer.emitJavadoc("Automatically generated file. DO NOT MODIFY")
            .emitPackage(mBuildConfigPackageName)
            .beginType("BuildConfig", "class", publicFinal);
    for (ClassField field : mFields) {
        writer.emitField(
                field.getType(),
                field.getName(),
                publicFinalStatic,
                field.getValue());
    }
    for (Object item : mItems) {
        if (item instanceof ClassField) {
            ClassField field = (ClassField)item;
            writer.emitField(
                    field.getType(),
                    field.getName(),
                    publicFinalStatic,
                    field.getValue());
        } else if (item instanceof String) {
            writer.emitSingleLineComment((String) item);
        }
    }
    writer.endType();
    out.close();
}

}

Так что это невозможно, потому что BuildConfigGenerator создает только public final модификаторы

Set<Modifier> publicFinal = EnumSet.of(Modifier.PUBLIC, Modifier.FINAL);

writer.emitJavadoc("Automatically generated file. DO NOT MODIFY")
            .emitPackage(mBuildConfigPackageName)
            .beginType("BuildConfig", "class", publicFinal);

и не дает вам выбора)

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