Size: a a a

2020 February 21

ДЧ

Денис Чиканов in pro.jvm
Human
Пишу либу, подскажите, пожалуйста, как мне реализовать одну задумку на джаве.
Вообщем есть метод который принимает на вход две лямбды Supplier и Consumer. Мне нужно как-то связать тип возвращаемого значения и принимаемого, они не должны быть одинаковыми, но должны использоваться только вместе. Похоже на перегрузку с дженериками, но мне нужно еще, чтобы "перегружать" можно было и в любом другом участке кода, что похоже на котлиновские экстеншн функции, но мне нужно на Java.

Вот пример чего я хочу достичь: https://pastebin.com/Har3MCH6
askAndAnswer должно быть можно перегружать из других модулей

public void test() {
       Routes
               .when(MyState.PizzaSelect,
                       askAndAnswer(
                               () -> new Select("Выберите пиццу", List.of("Маргарита", "Пепперони", "Мясная")),
                               (String res) -> {
                                   save(res);
                                   next(MyState.Order);
                               }
                       )
               )
               .when(MyState.Number,
                       askAndAnswer(
                               () -> new NumberQuestion("Сколько?"),
                               (Integer res) -> {
                                   save(res);
                               }
                       )
               );
   }

   public static void askAndAnswer(Supplier<Select> q, Consumer<String> a) {

   }
   public static void askAndAnswer(Supplier<NumberQuestion> q, Consumer<Integer a) {

   }
Афаик, в джаве полиморфные методы с отличием только в типовом параметре делать нельзя.
источник

NB

Nikita Bezverkhy in pro.jvm
Алексей C
какой jdbcUrl?
который контейнер отдаёт
по-разному
например, jdbc:postgresql://localhost:32994/test?loggerLevel=OFF
источник

A

Artjom Kalita in pro.jvm
как ты просетываешь jdbc урл из контейнера в приложении ?
источник

NB

Nikita Bezverkhy in pro.jvm
Artjom Kalita
как ты просетываешь jdbc урл из контейнера в приложении ?
container.getJdbcUrl()
источник

H

Human in pro.jvm
Денис Чиканов
Афаик, в джаве полиморфные методы с отличием только в типовом параметре делать нельзя.
У уже понял, но вот думаю мб можно как то через рефлексию но из-за type erasure
источник

A

Artjom Kalita in pro.jvm
тяжело так нужен код
источник

ДЧ

Денис Чиканов in pro.jvm
Human
У уже понял, но вот думаю мб можно как то через рефлексию но из-за type erasure
А причём тут рефлексия, если ты такой код скомпилировать не можешь?
источник

NB

Nikita Bezverkhy in pro.jvm
Artjom Kalita
тяжело так нужен код
public class PostgresqlTest {

 @Rule
 public PostgreSQLContainer<?> container = new PostgreSQLContainer<>();

 @Test
 public void whenSelectQueryExecuted_thenResultsReturned() throws Exception {
   String jdbcUrl = container.getJdbcUrl();
   String username = container.getUsername();
   String password = container.getPassword();
   Connection connection = DriverManager.getConnection(jdbcUrl, username, password);
   ResultSet resultSet = connection.createStatement().executeQuery("SELECT 1");
   resultSet.next();
   int result = resultSet.getInt(1);

   assertEquals(1, result);
 }
}
источник

ДЧ

Денис Чиканов in pro.jvm
Ты не сможешь объявить два таких разных метода
источник

H

Human in pro.jvm
Денис Чиканов
А причём тут рефлексия, если ты такой код скомпилировать не можешь?
Ну сделать на примем Object, а там уже смотреть что пришло и сравнивать по мапе
источник

ДЧ

Денис Чиканов in pro.jvm
Human
Ну сделать на примем Object, а там уже смотреть что пришло и сравнивать по мапе
1) Ты прав, тебе будет мешать жить стирание типов (хотя можно просто передать Class<> в аргументы)
2) Ты представляешь, как документировать и тестировать такой код, где логика работы захардкожена-забита в зависимости от одного из аргументов?
источник

H

Human in pro.jvm
Денис Чиканов
1) Ты прав, тебе будет мешать жить стирание типов (хотя можно просто передать Class<> в аргументы)
2) Ты представляешь, как документировать и тестировать такой код, где логика работы захардкожена-забита в зависимости от одного из аргументов?
Второй вопрос не оч понял. Это очем? Что захардкожено?
источник

QH

Quantum Harmonizer in pro.jvm
Human
Пишу либу, подскажите, пожалуйста, как мне реализовать одну задумку на джаве.
Вообщем есть метод который принимает на вход две лямбды Supplier и Consumer. Мне нужно как-то связать тип возвращаемого значения и принимаемого, они не должны быть одинаковыми, но должны использоваться только вместе. Похоже на перегрузку с дженериками, но мне нужно еще, чтобы "перегружать" можно было и в любом другом участке кода, что похоже на котлиновские экстеншн функции, но мне нужно на Java.

Вот пример чего я хочу достичь: https://pastebin.com/Har3MCH6
askAndAnswer должно быть можно перегружать из других модулей

public void test() {
       Routes
               .when(MyState.PizzaSelect,
                       askAndAnswer(
                               () -> new Select("Выберите пиццу", List.of("Маргарита", "Пепперони", "Мясная")),
                               (String res) -> {
                                   save(res);
                                   next(MyState.Order);
                               }
                       )
               )
               .when(MyState.Number,
                       askAndAnswer(
                               () -> new NumberQuestion("Сколько?"),
                               (Integer res) -> {
                                   save(res);
                               }
                       )
               );
   }

   public static void askAndAnswer(Supplier<Select> q, Consumer<String> a) {

   }
   public static void askAndAnswer(Supplier<NumberQuestion> q, Consumer<Integer a) {

   }
> они не должны быть одинаковыми, но должны использоваться только вместе
я вот не понял, что это значит — вангую, что система типов тоже не поймёт
источник

H

Human in pro.jvm
Quantum Harmonizer
> они не должны быть одинаковыми, но должны использоваться только вместе
я вот не понял, что это значит — вангую, что система типов тоже не поймёт
Ну из примера надеюсь понятно, что я хотел сделать.
источник

NB

Nikita Bezverkhy in pro.jvm
бля, по ходу бд не успевает начинать принимать коннекшены
источник

d

dima in pro.jvm
Nikita Bezverkhy
бля, по ходу бд не успевает начинать принимать коннекшены
я ж говорил
источник

d

dima in pro.jvm
поэтому вот тебе совет
источник

d

dima in pro.jvm
используй static {}
источник

ДЧ

Денис Чиканов in pro.jvm
Human
Второй вопрос не оч понял. Это очем? Что захардкожено?
У тебя будет (if type == t1) {dosmth}…, else if (type == t2) {doanothersmth}…, и вот крайне неприятно пользователю библиотеки будет осознавать и разбираться, как один и тот же метод будет “по мапе” менять логику работы.
источник

d

dima in pro.jvm
и инициализируй контейнер там
источник