2014-12-22 3 views
0

Я думал, как обернуть все мои настройки и, например, использовать один или несколько раз. Давайте подумаем немного абстрактно.Является ли настройка класса обертки хорошей практикой?

class WholeApplicationSettingsInHere{ 
    private static boolean setting1, setting2; 

    WholeApplicationSettingsInHere(){set defaults} 

    public static boolean getSetting1(){return setting1} 
    public static void setSetting1(setting1){set setting1} 

    public static boolean getSetting2(){return setting2} 
    public static void setSetting2(setting2){set setting2} 

    ... 
} 

class One(){ 
/*No fields in here, except private fields*/ 
    methodOne(){use variables from WholeApplicationSettingsInHere class} 
    methodTwo(){} 
} 

class Two(){ 
/*No fields in here, except private fields*/ 
    methodOne(){use variables from WholeApplicationSettingsInHere class} 
    methodTwo(){} 
} 

Вопрос в том, будет ли это хорошей практикой делать это таким образом?

+0

Да, если вы используете getter для доступа и не изменяете состояние WholeApplicationSettingsInHere. – SMA

ответ

0

Очень сложно ответить «это хорошая практика», потому что нет однозначного ответа. Это полностью зависит от вашего контекста. Возможно, вы захотите предоставить MCVE, который более точно отражает то, что вы делаете.

Я скажу, что сделать эти переменные и методы статичными - довольно ужасная идея - что происходит по дороге, если вы хотите два экземпляра вашего класса настроек?

И прежде чем вы скажете: «Мне нужен только один экземпляр настроек» - вы не можете знать это раньше времени. Это неправильное использование ключевого слова static.

И в этом случае - почему бы просто не использовать экземпляр класса Properties?

+0

Вы точно понимали, что я хотел. То, что вы сказали о статичности, верно. Я так не думал об этом. Теперь я проверю класс Properties, как вы упомянули. Спасибо Вам за Ваш вклад! – Kris

1

Вы должны указать PreferenceManager и SharedPreferences, чтобы сохранять и получать пользовательские настройки. Использование статических булевых элементов в классе на самом деле не кажется отличной идеей.

Просто создать простой класс с методами, например:

public class PreferencesHelper { 

    private PreferencesHelper() {} // No instantiation 

    public static boolean getSetting1(Context context) { 
     return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(PREFERENCE_KEY, defaultValue); 
    } 

    public static void setSetting1(Context context, boolean value) { 
     Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit(); 
     editor.putBoolean(PREFERENCE_KEY, value); 
     editor.apply(); 
    } 

} 

И, наконец, ответить на ваш вопрос: Да, это может быть хорошей практикой, если вы делаете что-то вроде упомянутого выше кода. Поступая таким образом, вы не можете иметь ключи предпочтений, разбросанные по вашему приложению, и это упрощает чтение кода.

Сказав, что, если вы когда-либо в ситуации, когда вам нужно установить несколько настроек одновременно, это немного отходов, чтобы звонить setSetting1(), setSetting2(), setSetting3() и т.д., так как вы воссоздавать объекты снова и снова. В таких случаях просто получите объект Edtior, внесите все свои изменения и примените изменения.

+0

Хорошо. Я передумал. Вы имеете право. Это будет быстрее, нужно меньше времени и ресурсов. Спасибо! – Kris

+0

@ Kris быстрее? SharedPreferences относительно медленны! Если вам нужны данные за пределами жизненного цикла вашей деятельности, вы можете использовать sharedpreferences. Если вам просто нужны данные внутри действия LifeCycle, статическая переменная должна быть намного быстрее. – Mike

+0

@Mike Не использовать apply(). Он немедленно вносит изменения в память и запускает фоновое задание для обновления базы данных. Независимо от того, что вы используете настройки только несколько раз, вы не заметите разницы. Если вы используете их часто в одном классе, вы должны их кэшировать. –

Смежные вопросы