Упростить множественные наследуемые классы (с одинаковым содержимым) абстрактного класса - PullRequest
1 голос
/ 26 сентября 2019

Мне нравится подсчитывать несколько вещей в моем приложении и сохранять значение в общих настройках Android.Все работает, но меня не устраивает дизайн класса в целом.

Очень простой абстрактный класс.Параметр класса используется для именования ключей в sharedPreferences.

public abstract class Counter {

    private Context mContext;
    private Class mClass;

    Counter(Class myClass, Context context) {
        this.mClass = myClass;
        this.mContext = context;
    }

    public Integer getValue() {
        return PrefManager.with(mContext).getInt(mClass.getName(), 0);
        //return UniversalPreferences.getInstance().get(counterName, 1);
    }

    public void increment() {
        PrefManager.with(mContext).save(mClass.getName(), getValue() + 1);
        //UniversalPreferences.getInstance().put(counterName, getCurrentValue(counterName) + 1);
    }
}

До сих пор у меня уже есть 5 классов, унаследованных от Counter с одинаковым содержимым.

public class CounterAppLaunch extends Counter {

    @SuppressLint("StaticFieldLeak")
    private static CounterAppLaunch instance;

    private CounterAppLaunch(Context context) {
        super(CounterAppLaunch.class, context);
    }

    public static CounterAppLaunch getInstance(Context context) {
        if(CounterAppLaunch.instance == null) {
            CounterAppLaunch.instance = new CounterAppLaunch(context);
        }
        return CounterAppLaunch.instance;
    }
}

У меня есть счетчики, которые мне нравятсявызов из разных классов и увеличение там (например, CounterAPICall или CounterOnResumeCallExample).Который работает с этим кодом просто отлично.

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Этот код может быть полезен для извлечения соответствующего счетчика:

public Counter{
    private int count;

    public Counter(){
        count = 0;
    }

    public int getValue(){
        return count;
    }

    public void increment(){
        counter++;
    }
}

public CounterStorage(){
    private static HashMap<String, Counter> counterMap = new HashMap<>();

    public static Counter getInstance(String str){
        if (counterMap.containsKey(str)) return counterMap.get(str);

        Counter newCounter = new Counter();
        counterMap.add(str, newCounter);
        return newCounter;

    }
}

В этом случае Counter не является абстрактным классом.Для любых целей вы можете присвоить счетчику имя, которое хранится на карте.

0 голосов
/ 26 сентября 2019

С помощью инъекций Dependency и HasA, мы можем попробовать,

public class CounterAppLaunch{
    @Autowired
    CounterAdapter counterAdapter;
    @SuppressLint("StaticFieldLeak")
    private static CounterAppLaunch instance;

    private CounterAppLaunch(Context context) {
        super(CounterAppLaunch.class, context);
    }

    public static CounterAppLaunch getInstance(Context context) {
        if(CounterAppLaunch.instance == null) {
            CounterAppLaunch.instance = new CounterAppLaunch(context);
        }
        return CounterAppLaunch.instance;
    }
}

CounterAdapter extends Counter{
    @Autowired
    private Context mContext;
    @Autowired
    private Class mClass;
    // getter and setter
}

public abstract class Counter {


    private Context mContext;

    private Class mClass;

    Counter(Class myClass, Context context) {
        this.mClass = myClass;
        this.mContext = context;
    }

    public Integer getValue() {
        return PrefManager.with(mContext).getInt(mClass.getName(), 0);
        //return UniversalPreferences.getInstance().get(counterName, 1);
    }

    public void increment() {
        PrefManager.with(mContext).save(mClass.getName(), getValue() + 1);
        //UniversalPreferences.getInstance().put(counterName, getCurrentValue(counterName) + 1);
    }
}
...