IntelliJ'de oluşturucu kalıp kodu oluşturma


83

IntelliJ'de Oluşturucu kalıplarını yazmayı otomatikleştirmenin herhangi bir yolu var mı?

Örneğin, bu basit sınıf verildiğinde:

class Film {
   private String title;
   private int length;

   public void setTitle(String title) {
       this.title = title;
   }

   public String getTitle() {
       return this.title;
   }

   public void setLength(int length) {
       this.length = length;
   }

   public int getLength() {
       return this.length;
   }
}

IDE'yi bunu veya benzerini oluşturması için alabileceğim bir yol var mı:

public class FilmBuilder {

    Film film;

    public FilmBuilder() {
        film = new Film();
    }

    public FilmBuilder withTitle(String title) {
        film.setTitle(title);
        return this;
    }

    public FilmBuilder withLength(int length) {
        film.setLength(length);
        return this;
    }

    public Film build() {
        return film;
    }
}

Yanıtlar:


108

Değiştiriciyi Oluşturucu yeniden düzenleme ile kullanın .

Bu işlevi kullanmak için, kodunuzdaki kurucunun imzasına tıklayın, ardından sağ tıklayıp "Yeniden Düzenleyici" menüsünü seçin, ardından kodu oluşturmak üzere iletişim kutusunu açmak için "Oluşturucuyu Oluşturucu ile Değiştir ..." öğesine tıklayın.


12
"SetX ()" i "withX ()" olarak değiştirmenin bir yolu var mı, Serge?
ae6rt

5
Veya setX () 'i sadece x () olarak değiştirebilir misiniz?
Kurru

Güzel! Var olan asla yeni değil. Teşekkürler
vikingsteve

16
Oluşturucu oluşturma penceresinin sağ üst köşesindeki dişliye tıklayarak ve "Ayarlayıcı Önekini Yeniden Adlandır" seçeneğini seçerek ayarlayıcı yöntemlerinin adını değiştirebilirsiniz. Daha sonra "ile" olarak değiştirebilir veya öneki tamamen kaldırabilirsiniz.
Chris B

3
IntelliJ'in Builder sınıfını bir iç sınıf olarak otomatik olarak oluşturması mümkün müdür?
kit

23

IntelliJ'de yerleşik oluşturucu kalıbı oluşturmanın birkaç nedenden dolayı biraz hantal olduğunu buldum:

  1. Referans olarak mevcut bir kurucuyu kullanması gerekir.
  2. "Oluştur" menüsünden ( command+NOS X'te) hızlı bir şekilde erişilemez .
  3. Yalnızca harici Builder sınıfları oluşturur. Başkalarının da bahsettiği gibi, oluşturucu modelini uygularken statik iç sınıfların kullanılması çok yaygındır.

InnerBuilder eklentisi tüm bu eksikliklerin adreslerini ve hiçbir kurulum ve yapılandırma gerektirir. Eklenti tarafından oluşturulan örnek bir Oluşturucu:

public class Person {
    private String firstName;
    private String lastName;
    private int age;

    private Person(Builder builder) {
        firstName = builder.firstName;
        lastName = builder.lastName;
        age = builder.age;
    }

    public static final class Builder {
        private String firstName;
        private String lastName;
        private int age;

        public Builder() {
        }

        public Builder firstName(String firstName) {
            this.firstName = firstName;
            return this;
        }

        public Builder lastName(String lastName) {
            this.lastName = lastName;
            return this;
        }

        public Builder age(int age) {
            this.age = age;
            return this;
        }

        public Person build() {
            return new Person(this);
        }
    }
}

3
, Bakınız benim cevap için yerleşik bir senin belirtilen tüm sorunların çözümü.
jFrenetic

1
@JFrenetic olmak üzere bazı iyi noktalara değindiniz, ancak nihayetinde bu geçici çözümlerle bile yerleşik yaklaşımı çok külfetli buluyorum. Eklenti ile, kelimenin tam anlamıyla sadece var alt+shift+B, enterve BAM, kendi oluşturucu var. : D
Mansoor Siddiqui

1
OMG bu bir rüya gerçek oldu. Yerleşik inşaatçı bunu benim için yapmadı - Ben inşaatçıyı PoJo'nun iç sınıfı olarak kullanmayı tercih ederim. Teşekkürler güzel bir ipucu!
Somaiah Kumbera

16

Mansoor Siddiqui'nin bahsettiği eksikliklerin üstesinden gelmek için :

1) Referans olarak mevcut bir kurucuyu kullanması gerekir.

Üretilmesi çok kolay. Sadece hit Alt+ Insmenüsünü oluşturmak ve seçim çağırmak için Windows üzerinde Constructor.

2) "Oluştur" menüsünden hızlı bir şekilde erişilemez (OS X'te command + N)

Sadece gidin Settings -> Keymap, arayın Builderve istediğiniz bir kısayol atayın (bu işlevi çok sık kullanıyorsanız, ki bu nadiren görülür). Örneğin Alt+ atayabilirsiniz B.

Diğer bir alternatif ise Ctrl+ Shift+ A(Eylem Bul). Yazmaya başlayın Builderve hemen komuta erişeceksiniz:

Eylem Bul iletişim kutusu

Bu kısayolu herhangi bir IntelliJ IDEA özelliğine hızlı bir şekilde erişmek için kullanabilirsiniz (bu, komutun tam olarak ne dendiğini ve nerede bulacağınızı hatırlamadığınızda çok yardımcı olur).

3) Yalnızca harici Builder sınıfları oluşturur. Başkalarının da bahsettiği gibi, oluşturucu modelini uygularken statik iç sınıfların kullanılması çok yaygındır .

Ayrıca kurucularımı statik iç sınıflar olarak tercih ederim. Ne yazık ki, bunu yapmanın kolay bir yolu yok, ancak yine de uygulanabilir. İç içe geçmiş iç sınıfı kendiniz tanımlamanız gerekir (boş bırakın) ve Replace Constructor with Builderdiyaloğu çağırdığınızda , Use existingseçeneği seçin ve iç sınıfınızı seçin. Tıkır tıkır çalışıyor! Yine de, bu seçeneği yapılandırılabilir hale getirmek daha kolay olurdu.


12

Joshua Block tarafından açıklandığı gibi bunun bir iç oluşturucu sınıf ile bir sınıf oluşturmak için kullanılıp kullanılamayacağını merak ediyorsanız - önce boş bir iç sınıf tanımlamanız, ardından "Var olanı kullan" seçeneğini işaretlemeniz ve yeni oluşturduğunuz (iç sınıf ) ve "Refactor" düğmesine basın.

PS! "Oluşturucuyu Oluşturucu ile Değiştir" yeniden düzenleme işlevini kullanmak için imleç yapıcının içinde (önceden yazılmış) bulunmalıdır.


Bu eklentilerin, oluşturucu modelinin önemli bir bölümünü unutması ilginçtir: yine de yapıcıda gerekli parametreleri tanımlamalısınız. Aksi takdirde, eksik param hatalarını statik olarak yakalamaktan yalnızca çalışma zamanında yakalamaya geçtiniz.
EJ Campbell

@EJCampbell Bu , gerekli olsalar bile parametrelere isim eklemenin bir yolunu sağlayarak kodu daha okunaklı hale getirmek olan bir Oluşturucu kullanmanın amaçlarından birini ortadan kaldırır . Bu, bir kurucu oldukça fazla sayıda parametre aldığında yardımcı olur. Java, çağrıda C # ve Swift gibi gerçek parametreleri adlandırmamıza izin verseydi gerekli olmazdı.
ajb

5

Bunun IntelliJ yolu, IMHO'nun kıvrımlı olmasıdır. Amaca çok daha iyi hizmet eden iki eklenti var (bunu tercih ederim: https://plugins.jetbrains.com/plugin/7354 ).

Örneğin, Builder sınıfının PoJo'nun iç sınıfı olmasını tercih ederim. Bunu IntelliJ ile başarmak için birkaç ekstra vuruşa ihtiyacınız var.

Eklenti için bir başka artı, işlevselliğin konumudur ( Generate...bağlam menüsünde).


4

Lombok bunu yapmanın en kolay yolu! (Sözdizimi desteği için bir Intellij eklentisine sahiptir https://plugins.jetbrains.com/plugin/6317-lombok-plugin )

Sadece bir @Builderaçıklama ekleyin ve duvarların arkasına nesnenin içine bir oluşturucu uygulaması ekleyecektir.

Lombok ile:

import lombok.Builder;
import lombok.Singular;
import java.util.Set;

@Builder
public class BuilderExample {
  @Builder.Default private long created = System.currentTimeMillis();
  private String name;
  private int age;
  @Singular private Set<String> occupations;
}

Lombok olmadan:

import java.util.Set;

public class BuilderExample {
  private long created;
  private String name;
  private int age;
  private Set<String> occupations;
  
  BuilderExample(String name, int age, Set<String> occupations) {
    this.name = name;
    this.age = age;
    this.occupations = occupations;
  }
  
  private static long $default$created() {
    return System.currentTimeMillis();
  }
  
  public static BuilderExampleBuilder builder() {
    return new BuilderExampleBuilder();
  }
  
  public static class BuilderExampleBuilder {
    private long created;
    private boolean created$set;
    private String name;
    private int age;
    private java.util.ArrayList<String> occupations;
    
    BuilderExampleBuilder() {
    }
    
    public BuilderExampleBuilder created(long created) {
      this.created = created;
      this.created$set = true;
      return this;
    }
    
    public BuilderExampleBuilder name(String name) {
      this.name = name;
      return this;
    }
    
    public BuilderExampleBuilder age(int age) {
      this.age = age;
      return this;
    }
    
    public BuilderExampleBuilder occupation(String occupation) {
      if (this.occupations == null) {
        this.occupations = new java.util.ArrayList<String>();
      }
      
      this.occupations.add(occupation);
      return this;
    }
    
    public BuilderExampleBuilder occupations(Collection<? extends String> occupations) {
      if (this.occupations == null) {
        this.occupations = new java.util.ArrayList<String>();
      }

      this.occupations.addAll(occupations);
      return this;
    }
    
    public BuilderExampleBuilder clearOccupations() {
      if (this.occupations != null) {
        this.occupations.clear();
      }
      
      return this;
    }

    public BuilderExample build() {
      // complicated switch statement to produce a compact properly sized immutable set omitted.
      Set<String> occupations = ...;
      return new BuilderExample(created$set ? created : BuilderExample.$default$created(), name, age, occupations);
    }
    
    @java.lang.Override
    public String toString() {
      return "BuilderExample.BuilderExampleBuilder(created = " + this.created + ", name = " + this.name + ", age = " + this.age + ", occupations = " + this.occupations + ")";
    }
  }
}

Kaynak: https://projectlombok.org/features/Builder


lombok, ekstra adımlarla kod üretmedir. Bu nedenle, okudukları son kod java'ya benzemediği için bir dizi statik analiz aracını karıştırır.
ThisCompSciGuy


0

@ CrazyCoder'in cevabının bir tamamlayıcısı olarak , Oluşturucuyu Oluşturucu ile Değiştir iletişim kutusunun sağ üst tarafında ayarlayıcıların önekini yeniden adlandırmak için kullanabileceğiniz bir yapılandırma düğmesi olduğunu bilmenin çok yararlı olduğunu düşünüyorum .


0

"Çok fazla parametreyi" bir oluşturucu kalıbı ile değiştirmek isteyenler için, "parametre nesnesini ayıkla" ve ardından burada diğer yanıtlarda belirtilen kurucuyu oluşturucuya dönüştür.


0

Oluştur> Oluşturucu sınıfına sağ tıklayarak sınıfın yapıcısını oluşturun. Ardından, Windows'ta eylemi bulmak için Ctrl + Shift + A tuşlarına basın ve "oluşturucu" yazın, "Oluşturucuyu oluşturucu ile değiştir .." seçeneğini seçin.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.