Есть несколько вопросов на которые я не смог найти адекватного ответа. Я джаву изучаю всего пару месяцев, так что простите если где-то глупость спросил.
1. Type alias. Я могу в С++ написать using MyType = std::vector<std::pair<std::string, MonstrousSuperClass>> и дальше везде использовать MyType, что заметно повышает читаемость кода. Есть ли что-то аналогичное в джаве?
2. Можно ли как-то сделать константные методы? Хочу написать интерфейс, в котором будет чётко видно, что некоторые методы не должны менять состояние объекта (т.к. я на это опираюсь при реализации некоторых алгоритмов, работающих с объектами этого типа).
3. Есть ли какой-то аналог декораторов из питона? Хочу, например, сделать мемоизацию функции (т.е. обёртку, которая будет запоминать с какими аргументами вызывали функцию и в следующих вызовах сразу возвращать сохранённый результат для "запомненного" набора аргументов). Ну или хочу сделать обёртку для автоматического ретрая в случае некоторых исключений.
4. Если я не собираюсь заниматься мобильной разработкой - какие есть у джавы преимущества над сочетанием "питоном + С++"? Это не попытка начать холивар, а вполне искреннее любопытство, т.к. пытаюсь понять, насколько мне вообще имеет смысл погружаться в этот язык.
1. Кажется нет такой возможности. Только экстендить классы разве что, что-нть типа такого:
class MyType extends ArrayList<Map.Entry<String, MonstrousSuperClass>>
2. Сейчас можно писать реализации методов в интерфейсах начиная чтоли с 8-й джавы, в интерфейсах нет полей и соответсвенно состояния, потому такие методы не способны менять состояние напрямую, а только через вызов других методов. Фик знает это то что вам надо или не.
3. Декораторы есть - это т.н. прокси видимо, java.lang.reflect.Proxy идет "из коробки", но имеет серьезные ограничения - можно только интерфейсы проксировать. Вообще прокси это основа AOP, контекстов и циклических зависимостей (зло!) в CDI, потому разработаны способы проксировать классы с помощью генерации байткода на лету, иными словами либа для вашего класса Foo сгенерит класс FooProxy который унаследован от Foo. Либы такие стопудово есть, прокси я видел, но по названиям либов не порекомендую (ну разве что asm глянуть и кто ей пользуется), часто CDI бины проксируют чтоб все вызовы к бину проходили через проксю и она бы отвечала за вызов интерсепторов и настройку контекста.
Вообще если можно избежать использования таких штук, то лучше избегать, ибо стектрейсы и дебаг превращаются в ужас, и все это не блещет перформансом.
4. А фик его знает, есть какая никакая типизация, сборка мусора, приятный синтаксис и богатая инфраструктура - тьма либов и тулов и документации. Джава не супер высокоуровневая, но и не слишком низкоуровневая, всего в меру.
Но джава контролируется американской корпорацией в сложившихся условиях видимо надо искать инструменты не подконтрольные западным правительствам. Инвестируете в разработку на джаве, а вам перекроют доступ к ней, ну и смысл?
1) Насколько я знаю, такого нет.
2) Возможно Вам поможет использование аннотаций. То есть создаёте свою аннотацию и помечайте ей те методы, которые не должны менять состояние объектов.
Возможно поможет использование final перед описанием параметров методов. Это запретит менять входящие объекты, но не их содержимое.
3) С питоном знаком поверхностно, не очень понимаю как должно работать.
4) Думаю, что особых преимуществ нет. Мобильная разработка под андройд, наверное основное преимущества Джавы, как языка для изучения. Сочетание Pyton и C++ - очень хороший вариант для широкого круга задач.
Помощники
243 поста785 подписчиков
Правила сообщества
Нельзя обсуждать Политику.
Ругаться и оскорблять.