Что происходит, когда компилятор Java видит много конкатенаций строк в одной строке?

Лучшая практика когда-либо

Создать интерфейс с помощью PreferenceManager:

// Interface to save values in shared preferences and also for retrieve values from shared preferences
public interface PreferenceManager {

    SharedPreferences getPreferences();
    Editor editPreferences();

    void setString(String key, String value);
    String getString(String key);

    void setBoolean(String key, boolean value);
    boolean getBoolean(String key);

    void setInteger(String key, int value);
    int getInteger(String key);

    void setFloat(String key, float value);
    float getFloat(String key);

}

Как использовать с Activity / Fragment:

public class HomeActivity extends AppCompatActivity implements PreferenceManager{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout_activity_home);
    }

    @Override
    public SharedPreferences getPreferences(){
        return getSharedPreferences("SP_TITLE", Context.MODE_PRIVATE);
    }

    @Override
    public SharedPreferences.Editor editPreferences(){
        return getPreferences().edit();
    }

    @Override
    public void setString(String key, String value) {
        editPreferences().putString(key, value).commit();
    }

    @Override
    public String getString(String key) {
        return getPreferences().getString(key, "");
    }

    @Override
    public void setBoolean(String key, boolean value) {
        editPreferences().putBoolean(key, value).commit();
    }

    @Override
    public boolean getBoolean(String key) {
        return  getPreferences().getBoolean(key, false);
    }

    @Override
    public void setInteger(String key, int value) {
        editPreferences().putInt(key, value).commit();
    }

    @Override
    public int getInteger(String key) {
        return getPreferences().getInt(key, 0);
    }

    @Override
    public void setFloat(String key, float value) {
        editPreferences().putFloat(key, value).commit();
    }

    @Override
    public float getFloat(String key) {
        return getPreferences().getFloat(key, 0);
    }
}

Примечание: Заменить ваш ключ SharedPreference с SP_TITLE.

Примеры:

Сохранить строку в shareperence:

setString("my_key", "my_value");

Получить строку из shareperence:

String strValue = getString("my_key");

Надеюсь, это вам поможет.

30
задан Kip 18 August 2009 в 21:23
поделиться

1 ответ

Он генерирует эквивалент:

String s = new StringBuilder("abc")
           .append(methodReturningAString())
           .append("ghi")
           .append(anotherMethodReturningAString())
           .append("omn")
           .append("blablabla")
           .toString();

Достаточно умен для предварительного объединения статических строк (например, «omn» + «blablabla» ) . Вы можете назвать использование StringBuilder «уловкой производительности», если хотите. Это определенно лучше для производительности, чем выполнение пяти конкатенаций, приводящих к появлению четырех ненужных временных строк. Кроме того, использование StringBuilder улучшило производительность (я думаю) Java 5; до этого использовался StringBuffer.

Изменить : как указано в комментариях, статические строки предварительно объединяются, только если они находятся в начале объединения. Иначе нарушится порядок операций (хотя в данном случае я думаю, что Sun могла бы это оправдать). Итак, учитывая это:

String s = "abc" + "def" + foo() + "uvw" + "xyz";

он будет скомпилирован следующим образом:

String s = new StringBuilder("abcdef")
           .append(foo())
           .append("uvw")
           .append("xyz")
           .toString();
40
ответ дан 28 November 2019 в 00:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: