Во-первых, класс String
является неизменяемым типом, то есть методы String
не изменяют внутреннее состояние (т. Е. Массив char
), вместо этого они возвращают новый экземпляр типа String
.
Чтобы отразить это поведение, вы можете реализовать что-то вроде этого:
public MyString toLowerCase() {
char temp = new char[value.length];
// [...] Your code performing the actual logic on temp
return new MyString(temp);
}
Неизменность (и ее значение) класса String
очень важна для понимания на практике. Например, следующий код проконтролирует ожидаемый результат:
String word = "Word";
System.out.println("I can produce upper case (" + word.toUpperCase() + ") " +
"and lower case (" + word.toLowerCase() + ") " +
"without any side-effects on the original (" + word + ").");
Однако невозможно (без «хакерских» решений) реализовать такой метод:
void shortenString(String inputAndOutput);
Во-вторых, присвоение ожидает, что класс / метод должен использоваться следующим образом:
System.out.println(str.toLowerCase());
Атрибут out
фактически является PrintStream
, который предлагает (помимо других методов) следующие два:
println(Object x)
- печатает объект, а затем завершает строку.
println(String x)
- печатает строку, а затем завершает строку.
Если метод вызывается с параметром Object
, внутренняя реализация вызывает toString()
для данного объекта, таким образом, единственный способ удовлетворить требование - переопределить этот метод. К сожалению, это не разрешено назначением.
Однако, если явно не указано, что решение должно использовать java.lang.System
, вы можете просто реализовать свой собственный класс System
, который принимает MyString
, например ::
public class System {
public static class MyPrintStream /* optional: extends PrintStream */ {
public void println(MyString x) {
java.lang.System.out.println(x.getCharArray());
}
}
public static final out = new MyPrintStream();
}
Это позволит вам использовать его точно так же, как описано в задании:
import my.package.System;
public class Main {
public static void main(String[] args) {
// [...] Instantiate str
System.out.println(str.toLowerCase());
}
}