Как создать перезаписываемую конфигурацию в Java? - PullRequest
0 голосов
/ 18 мая 2011

У меня есть две версии приложения на основе проекта библиотеки общего кода.

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

Упрощенная проблема: у меня в проекте библиотеки есть логическое поле, которое определяет, показывать или нет рекламу в моем приложении. По умолчанию это правда (как определено в проекте библиотеки), и версия A приложения подходит для этого. Но мне нужно, чтобы приложение версии B было добавлено бесплатно, поэтому мне нужно установить это значение в false.

Как я могу реализовать это, чтобы я мог существенно переопределить значение конфигурации в проекте библиотеки из проектов, которые ссылаются на библиотеку?

Я могу изменить как реализацию библиотеки, так и реализацию ссылочного проекта.

Редактировать

Кроме того, логическое значение конфигурации влияет только на поведение кода библиотеки.

Ответы [ 4 ]

2 голосов
/ 19 марта 2012

Немного поздно, но я обнаружил, что это решение хорошо работает в моих проектах.Он использует класс Android Application для установки экземпляра одноэлементной конфигурации, который переопределяет конфигурацию библиотеки.

Config и ConfigInstance ниже находятся в библиотеке.

public final class Config {

    public static final boolean VAL;

    private Config() {}

    static {
        // this will be overridden by previous calls to 
        // ConfigInstance.getInstance()
        final ConfigInstance confInstance = ConfigInstance.getInstance(ConfigInstance.DEFAULT_VAL);
        VAL = confInstance.val;
   }

}

// Singleton helper class, be sure not to reference the Config class 
// here so that it is not loaded
public final class ConfigInstance {

    private static volatile ConfigInstance instance = null;

    static final boolean DEFAULT_VAL = false;

    public final boolean val;

    private ConfigInstance(final boolean val) {
        this.val = val;
    }

    // thread safe singleton generator
    public static ConfigInstance getInstance(final boolean val) {
        ConfigInstance result = instance;
        if (result == null) {          // 1st check no lock
            synchronized (ConfigInstance.class) {
                result = instance;
                if (result == null) {  // 2nd check with lock
                    instance = result = new ConfigInstance(val);
                }
            }
        }
        return result;
    }

}

Добавьте следующий класс к каждому из проектов более высокого уровня, убедившись, что в манифесте указано поле «имя» в теге <application>.

public class ApplicationWrapper extends Application {

    static {
        // this will set the singleton ConfigInstance first, ie. before
        // the library static block is executed; forcing it to use the 
        // values here
        ConfigInstance.getInstance(true);
   }

}

При этом для Config.VAL будет установлено значениеtrue в проекте.

1 голос
/ 18 мая 2011

Другие варианты включают получение имени пакета Android из вашего контекста и принятие решения на основе этого или извлечение части метаданных из вашего манифеста.

1 голос
/ 18 мая 2011

Просто инкапсулируйте переменную в функции получения (getFoo ()) и используйте ее в своем коде. Затем переопределите геттер в ваших подклассах.

0 голосов
/ 18 мая 2011

Вы не должны использовать постоянное значение в этом случае.Что вы должны сделать, это создать абстрактный класс с геттером в нем, а затем расширить этот интерфейс следующим образом:

public abstract class Config {
     public abstract int getValue();
}

public class AppA extends Config {
     private static final int value = 1;

     @Override
     public int getValue(){
         return value;
     }
}

public class AppB extends Config {
     private static final int value = 2;

     @Override
     public int getValue(){
         return value;
     }
}

РЕДАКТИРОВАТЬ: OP добавил, что ему нужно значение конфигурации в коде своей библиотеки.Я предлагаю все еще использовать этот код, но затем добавить установщик в код библиотеки, чтобы получить значение, возвращенное этим получателем в коде установки приложения.

...