2015-07-18 3 views
1

В моем проекте Android у меня есть одноэлементный класс с именем Question, который будет использоваться в 90% случаев, пока приложение запущено. Класс содержит две статические переменные String с именем question и answer, поскольку новый экземпляр многократно вызывается с разными строками для ответа на вопрос и ответ, поэтому каждый новый объект String создается. Я думал об изменении переменных String до StringBuilder и каждый раз заменяю содержимое.Java Static String или Static StringBuilder

Вот код с String переменными:

public class Question { 

    private static Question mQuestionClass = null; 
    private static String mQuestion = ""; 
    private static String mAnswer = ""; 

    private Question() { 
    } 

    public static Question getQuestionInstance(String question, String answer) { 
     if (mQuestionClass == null) { 
      mQuestionClass = new Question(); 
     } 
     mQuestion = question; 
     mAnswer = answer; 
     return mQuestionClass; 
    } 

} 

Вот код с StringBuilder переменными:

public class Questiontwo { 

    private static Questiontwo mQ2 = null; 
    private static StringBuilder mQ = null; 
    private static StringBuilder mA = null; 

    private Questiontwo() { 
    } 

    public static Questiontwo newInstance(String q, String a) { 
     if (mQ2 == null) { 
      mQ2 = new Questiontwo(); 
     } 

     if (mQ == null) { 
      mQ = new StringBuilder(q); 
     } 
     mQ = mQ.replace(0, mQ.length(), q); 

     if (mA == null) { 
      mA = new StringBuilder(a); 
     } 
     mA = mA.replace(0, mA.length(), a); 
     return mQ2; 
    } 

} 

Какой должна я предпочитаю использовать меньше памяти, как это возможно?

+0

Какова цель использования 'StringBuilder', если вы не используете append здесь? Я не вижу ни '+ =' для строки в тяжелой загрузке 'for loop'? Ваш код не нужен 'StringBuilder' –

ответ

3

В обоих сценариях ваш дизайн кажется немного ошибочным.Вы используете статические переменные и инициализируете его в Constructor. Это кажется противоречивым - потому что если вы попытаетесь создать несколько экземпляров Question, статические переменные будут иметь значение, заданное созданным последним экземпляром.

Я хотел бы предложить использовать только простой класс

public class Question { 
    private String mQuestion = ""; 
    private String mAnswer = ""; 

    public Question(String question, String answer) { 
    mQuestion = question; 
    mAnswer = answer; 
    } 
} 

Просто создавать экземпляры Question и использовать их как обычный Java Objects, вместо того чтобы создавать синглтон с использованием статических переменных и в процессе ввести непреднамеренные ошибки. Пусть Android сделает сборку мусора объектов, которые больше не используются.

Question q = new Question("What is capital of India?", "New Delhi"); 
1

Класс StringBuilder полезен, когда вам нужно изменить содержание последовательности символов.

От Javadoc:

Основные операции по StringBuilder являются Append и вставить методы

StringBuilder становится очень полезно, чтобы заменить последовательность конкатенации с помощью + или concat() метод между строками.

Если вам нужно заменить все содержимое строки на другую строку StringBuilder не является правильным выбором. Infact Я предполагаю, что вы передадите строку с новым вопросом в StringBuilder, чтобы изменить его содержимое. Если вы это сделаете, вы уже создали новую строку (с новым вопросом).

Таким образом, используя StringBuilder в этом контексте, добавьте некоторое использование памяти и некоторые вычисления процессора, а не удалите их.

1

Сначала давайте обсудим две вещи:
Первый: зачем назначать строку другому, потребляет больше памяти.
Во-вторых: Как StringBuilder решает эту проблему.
One:
Когда у вас есть строка, например String a и присвоить ему значение, например a = "Hello", что Java будет делать это, чтобы создать новую строку в памяти и будет пункт к нему. Поэтому каждый раз, когда вы меняете значение, например, на a = "good", он создает еще одну строку в памяти, а указатель a будет меняться от hello до good и hello все еще существует в памяти, однако он доступен, потому что никто не указывает на него.
Два:
String builder вместо этого изменяет старую строку и изменяет ее на новую, чтобы она потребляла меньше памяти. Это полезно, если вы хотите изменить строку.

Я думаю, что поиск this также поможет вам.