Есть ли способ избежать использования конструктора при вызове этих методов? - PullRequest
0 голосов
/ 10 марта 2020

У меня есть этот код, пытающийся изменить строку выбора, добавив «wow» в конец. Я пытаюсь использовать собственный класс, а не просто объединять строки, потому что я хочу иметь возможность запускать и другие методы для него в будущем.

for(String choice : commands) {
    count++;
    if(goAvailable.contains(choice)) {
        actionApnd("You went to " + new ModifyString(choice).append("wow") + ".");
        //System.err.print(choice + " ");
        break;
    } else if (count == commands.length) {
        actionApnd("Where did you want to go?");
    }

}

класс ModifyString (обрезается):

public ModifyString(String str) {

    stringToReturn = str;
}

public String append(String toAppend) {

    stringToReturn += toAppend;

    return stringToReturn.trim();
}

У меня был этот метод в классе ModifyString, и я использовал его вместо конструктора, но в сообщении об ошибке говорилось, что я не могу запустить append для типа String.

public static String string(String str) {

    stringToReturn = str;
    return stringToReturn.trim();
}

1 Ответ

1 голос
/ 10 марта 2020
public static String string(String str) {

    stringToReturn = str;
    return stringToReturn.trim();
}

Проблема в том, что stringToReturn является полем экземпляра в ModifyString, что означает, что оно связано с указанным c экземпляром этого класса. В методе static такого экземпляра нет.

Непонятно, чего вы пытаетесь достичь, учитывая, что тип возвращаемого значения String: вы можете просто удалить первый оператор:

public static String string(String str) {
    return str.trim();
}

но тогда вы также можете просто вызвать str.trim() напрямую.

В качестве альтернативы вы могли иметь в виду вернуть экземпляр ModifyString:

public static ModifyString string(String str) {
    return new ModifyString(str.trim());
}

Обратите внимание, что Конкатенация строк - это плохой способ накопления строк, поскольку для выполнения конкатенации требуется копирование существующей строки.

Лучшим подходом было бы использование StringBuilder, либо напрямую, либо с переносом:

class ModifyString {
  private final StringBuilder sb;

  ModifyString(String str) {
    sb = new StringBuilder(str.trim());
  }

  ModifyString append(String str) {
    sb.append(str.trim());
    return this;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...