2016-08-05 3 views
2

я переменная экземпляра определяется как:переопределение ToString() в классе Дополнительный

final Optional<myClass> myOptional; 

Я хотел бы переопределить его метод toString() так, что вместо возвращения "[Optional(the value)]" он просто возвращает "(the value)" (или что-то еще, если это пусто). Но я не могу создать подкласс Optional, поскольку он, по-видимому, является окончательным. Как я могу это сделать?

ответ

2

GhostCat верен тем, что вы не можете подкласса Optional и переопределить его метод toString. Тем не менее, вы, вероятно, можете получить эффект, который вы хотите, написав это:

String myString = myOptional.map(MyClass::toString).orElse("(empty)") 

Это устанавливает myString в результат toString метода Значения, если значение присутствует, в противном случае он заменяет строку (empty) если значение отсутствует. Конечно, вы можете поместить туда любую заменяющую строку.

Optional является окончательным, так что будет легче преобразовать значение типа в будущую версию Java. См. Project Valhalla для получения информации о типах значений, в частности State of the Values для обзора и фона.

Optional также должен быть неизменным, поэтому необходимо подклассифицировать. См. Bloch, Эффективная Java, п. 15.

2

Вы не можете.

Невозможно изменить поведение методов класса от за пределами его исходного кода. Таким образом, единственный выбор, который вы получили, являются:

  1. Включите в исходный код этого класса и внести изменения там
  2. Расширение класса, переопределить метод, а затем использовать объекты производного класса

В вашем случае оба варианта невозможны. Извините, конец истории.

(да, другие, интерпретируемые языки позволят вам это сделать, но Java нет).

+0

Спасибо. Интересно, почему дизайнеры Java сделали необязательным окончательный класс. –

+0

Трудно сказать; но, вероятно, дело в том, что необязательный может появляться из многих стандартных вызовов библиотеки. Поэтому, возможно, это не так полезно, чтобы переопределить его ... как правило, это не ваш код, создающий дополнительные объекты. – GhostCat