Обходной путь Lombok @SuperBuilder на IntelliJ

У меня есть классный продукт:

   @Data
   @SuperBuilder
   public class Product {

        private String name;
        private String manufacturer;

   }

и расширенный класс

@Data
@SuperBuilder
public class Frame extends Product{

   private String model;

}

Я пытаюсь создать объект Frame с помощью построителя:

 return Frame.builder() 
        .name("Frame ABC")
        .manufacturer("Manufacturer")
        .model("Model 1")
        .build();

Я использую IntelliJ 2019.1.1 с плагином Lombok, но, к сожалению, компилятор отмечает как ошибку методы .name() и .manufacturer(). Я видел, как эта проблема открылась, и мне интересно, есть ли обходной путь, чтобы заставить мой код работать.


person drenda    schedule 24.04.2019    source источник
comment
Код компилируется и запускается за меня. Это просто ложная «ошибка» в IntelliJ, которую вы можете игнорировать, пока не будет выпущена окончательная версия плагина. С 1 сентября 2019 года выпущена альфа-версия github.com/mplushnikov / lombok-intellij-plugin / Release / tag /   -  person biniam    schedule 27.09.2019
comment
@SuperBuilder поддержка дала возможность выпустить 0.27 плагина IntelliJ Lombok.   -  person Jan Rieke    schedule 12.10.2019


Ответы (3)


Нет, пока проблема не будет решена.

Это проблема с курицей и яйцом. Пока классы с аннотациями @SuperBuilder не скомпилированы, фактически сгенерированные методы построителя не существуют. Плагин (после обновления / исправления) работает с IDE для этих методов, поэтому, даже если они еще не существуют, плагин сообщает IDE, какими они будут при компиляции.

Есть способы «обмануть», но все они - взломы - например, вы можете скомпилировать свои (супер) классы построителя в их собственном банке, а затем импортировать эту банку в свой проект. Когда вы скомпилировали классы SuperBuilder, они теперь содержат все сгенерированные методы, поэтому среда IDE увидит фактические методы и, следовательно, предложит их, если вы попытаетесь их использовать. Функционально, но не очень полезно ... если вам нужно обновить аннотированные классы SuperBuilder, теперь вы должны компилировать их каждый раз, прежде чем изменения станут видимыми. Очевидно, вы можете создать задачи сборки, чтобы сделать это за вас, но вы всегда работаете над реальной проблемой, которая связана с поддержкой плагинов.

person desr    schedule 05.05.2019

Этот обходной путь работает для меня:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product {

  private String name;
  private String manufacturer;

}

@Data
@NoArgsConstructor
public class Frame extends Product{

   private String model;

   @Builder
   public Frame(String name, String manufacturer, String model){
      super(name, manufacturer);
      this.model = model;
   }

}

Единственная проблема, которую я вижу, заключается в том, что когда у вас много полей в классе, писать такие конструкторы становится утомительно, но все же я думаю, что это того стоит, потому что в конце вы можете получить доступ к родительским и дочерним полям.

 return Frame.builder()
        
        .name("Frame ABC")
        
        .manufacturer("Manufacturer")
        
        .model("Model 1")
        
        .build();
person Andrey Polokh    schedule 30.07.2019

Сначала создайте поля дочерних элементов, а затем поля родительских элементов, с приведением типов, похоже, для меня работает:

return (Frame) Frame.builder()
                    .model("Model 1")
                    .name("Frame ABC")  
                    .manufacturer("Manufacturer")    
                    .build();
person lennon310    schedule 28.11.2019