Мне не хватает перегруженных операторов в Java, особенно в следующих ситуациях:
Класс, который является алгоритмом или функтором:
(Шаблон стратегии, Цепочка ответственности, Интерпретатор и т. Д.). Естественно, перегрузка op (); вместо этого каждый программист придумывает (часто несовместимые и, таким образом, сбивающие с толку) имена для функций: «eval», «define», «operation», «doIt» и т. д. Таким образом, ясность уменьшается, потому что эти имена мы вынуждены использовать не делайте их смысл очевидным.
Класс, который имеет преобразование в другой тип:
В C ++ это оператор Type (), который работает как для фактического преобразования, так и для получения внутреннего члена желаемого класса. Второй случай часто встречается в Java, когда класс неоправданно завершен, но вы хотите добавить к нему операции:
class DecoratedStringBuffer { //extends StringBuffer doesn't work, as String is final
private String byContainmentThen;
public decorate(final String prefix, final String suffix) { ... }
public append(final String s) { byContainmentThen.append(s);}
// other forwarding functions
}
Поскольку DecoratedStringBuffer не является StringBuffer, прежде чем он покинет ваш код и вернется к клиентскому коду, его необходимо преобразовать обратно, предположительно, с помощью функции, которая, наконец, применяет суффикс и префикс. Было бы здорово, если бы мы могли вызвать этот оператор StringBuffer () (и даже лучше, если бы Java, как и C ++, могла применить одно преобразование, предоставленное пользователем).
Вместо этого, поскольку нет соглашения, мы должны дать ему имя, которое обязательно будет более двусмысленным. getStringBuffer () - одно очевидное имя, но для многих пользователей Java это подразумевает соответствующий setStringBuffer, который нам не нужен. Даже если это не подразумевает этого, название неоднозначно: является ли StringBuffer тем, над которым мы работаем, или чем-то еще?
toStringBuffer () - лучшее имя, и шаблон, который я склонен применять, но затем кто-то, читающий код, задается вопросом, почему то, что выглядит как метод получения, называется "to" ClassName.
Честно говоря, кроме разработки числовых классов или "очевидно" совместимых объектов, для перегрузки op + мало что нужно. И поскольку Java не основана на значениях, как C ++, для op = нет особого смысла; Java не пытается заставить все действовать как примитивный класс значений int. Это op () и операторы преобразования, которые я пропускаю.