@UiField alanlarını özel yapma

Sonar aşağıdaki satırdan şikayetçi:

@UiField
Button saveBtn;

Değişken 'saveBtn' özel olmalı ve erişimci yöntemlerine sahip olmalı.

Görünürlük değiştiricisini private olarak ayarladığımda Howerver, IntelliJ IDEA'dan şikayet ediyor:

@UiField 'saveBtn' 'özel' olmamalı

Bu çatışma hakkında en iyi çözüm nedir (bu sonar uyarısını devre dışı bırakmanın yanı sıra)?

1
Sonar uyarısını devre dışı bırakmak. Ya da UIBinder çerçevesini kullanmamak.
katma yazar Boris the Spider, kaynak

9 cevap

GWT'nin kod üretimi, @UiFields özel olmamasını gerektirir. Derleme sırasında çalıştırılan UIBinder kod üreticisi, projenize dinamik olarak eklenen sizin için bir çok Java kodu oluşturacaktır.

Bu kod doğrudan alanlara erişecek ve gereçleri değişkenlerinize bağlayacaktır. Oluşturulan bu kod herhangi bir erişimci kullanmıyor ve buna izin vermek için bir seçenek yok. (ve aslında, bu gerçeği gizlediği gibi, bu değişkenlerin gerçekte ayarlandığı ve açıklamanın anlamını açık bir şekilde ifade ettiği için mükemmel bir anlam ifade eder).

Gereksinimin arkasındaki mantık budur, bu alanların özel olmasına izin verilmemektedir. Bu nedenle, bunun etrafında bir yol yoktur ancak sınıf için sonar uyarısını devre dışı bırakmaktır.

2
katma
Uygunsa, kuralı yalnızca ilgili sınıflar için devre dışı bırakabilirsiniz - bkz. docs .sonarqube.org/ekran/SONAR/daralma + Odak +
katma yazar Mithfindel, kaynak

GWT'nin kod üretimi, @UiFields özel olmamasını gerektirir. Derleme sırasında çalıştırılan UIBinder kod üreticisi, projenize dinamik olarak eklenen sizin için bir çok Java kodu oluşturacaktır.

Bu kod doğrudan alanlara erişecek ve gereçleri değişkenlerinize bağlayacaktır. Oluşturulan bu kod herhangi bir erişimci kullanmıyor ve buna izin vermek için bir seçenek yok. (ve aslında, bu gerçeği gizlediği gibi, bu değişkenlerin gerçekte ayarlandığı ve açıklamanın anlamını açık bir şekilde ifade ettiği için mükemmel bir anlam ifade eder).

Gereksinimin arkasındaki mantık budur, bu alanların özel olmasına izin verilmemektedir. Bu nedenle, bunun etrafında bir yol yoktur ancak sınıf için sonar uyarısını devre dışı bırakmaktır.

2
katma
Uygunsa, kuralı yalnızca ilgili sınıflar için devre dışı bırakabilirsiniz - bkz. docs .sonarqube.org/ekran/SONAR/daralma + Odak +
katma yazar Mithfindel, kaynak

GWT'nin kod üretimi, @UiFields özel olmamasını gerektirir. Derleme sırasında çalıştırılan UIBinder kod üreticisi, projenize dinamik olarak eklenen sizin için bir çok Java kodu oluşturacaktır.

Bu kod doğrudan alanlara erişecek ve gereçleri değişkenlerinize bağlayacaktır. Oluşturulan bu kod herhangi bir erişimci kullanmıyor ve buna izin vermek için bir seçenek yok. (ve aslında, bu gerçeği gizlediği gibi, bu değişkenlerin gerçekte ayarlandığı ve açıklamanın anlamını açık bir şekilde ifade ettiği için mükemmel bir anlam ifade eder).

Gereksinimin arkasındaki mantık budur, bu alanların özel olmasına izin verilmemektedir. Bu nedenle, bunun etrafında bir yol yoktur ancak sınıf için sonar uyarısını devre dışı bırakmaktır.

2
katma
Uygunsa, kuralı yalnızca ilgili sınıflar için devre dışı bırakabilirsiniz - bkz. docs .sonarqube.org/ekran/SONAR/daralma + Odak +
katma yazar Mithfindel, kaynak

GWT'nin kod üretimi, @UiFields özel olmamasını gerektirir. Derleme sırasında çalıştırılan UIBinder kod üreticisi, projenize dinamik olarak eklenen sizin için bir çok Java kodu oluşturacaktır.

Bu kod doğrudan alanlara erişecek ve gereçleri değişkenlerinize bağlayacaktır. Oluşturulan bu kod herhangi bir erişimci kullanmıyor ve buna izin vermek için bir seçenek yok. (ve aslında, bu gerçeği gizlediği gibi, bu değişkenlerin gerçekte ayarlandığı ve açıklamanın anlamını açık bir şekilde ifade ettiği için mükemmel bir anlam ifade eder).

Gereksinimin arkasındaki mantık budur, bu alanların özel olmasına izin verilmemektedir. Bu nedenle, bunun etrafında bir yol yoktur ancak sınıf için sonar uyarısını devre dışı bırakmaktır.

2
katma
Uygunsa, kuralı yalnızca ilgili sınıflar için devre dışı bırakabilirsiniz - bkz. docs .sonarqube.org/ekran/SONAR/daralma + Odak +
katma yazar Mithfindel, kaynak

UiBinder (ve iWn, ClientBundles vb. GWT'nin diğer birçok özelliği için), GWT derleyicisi görünümle aynı pakette ek bir Java sınıfı oluşturur. Bu sınıf görünümün alanlarına erişmek zorundadır (örneğin, bunları başlatmak için), bu nedenle paketin görünür olması gerekir (varsayılan olarak da bilinir). özel bu gereksinimi karşılamıyor.

Bunu bir örnek üzerinde görelim:

Bazı paketlerde ApplicationView.java var:

public class ApplicationView extends Composite {
    /* Needs to be package visible too */
    interface Binder extends UiBinder {
    }

    /* Doesn't matter what modifiers are here, but 
       it's usually static to give a hint to the GWT compiler
       that this field can be shared between instances of
       this class (like a, well, static)
    */
    private static Binder binder = GWT.create(Binder.class);

    @UiField Button button;

    public ApplicationView() {
        initWidget(binder.createAndBindUi(this));
    }
}

Aynı pakette, görünümünüzün nasıl düzenlendiğini tanımlayan ApplicationView.ui.xml 'si vardır.

Genelde görmediğiniz şey, GWT derleyicisinin her UiBinder görünümü için ek bir Java sınıfı oluşturmasıdır. Bu durumda, aynı kodda, ancak farklı bir kaynak klasörde ApplicationView_BinderImpl.java olur. Projenizi oluşturmak için ne kullandığınıza bağlı, ancak bunu temel aldığım bir maven projesi olması durumunda target/.generated konumundaydı.

Çok kısaltılmış bir biçimde, ApplicationView_BinderImpl şunun gibi görünebilir:

public class ApplicationView_BinderImpl implements UiBinder, com.example.ApplicationView.Binder {

  public com.google.gwt.user.client.ui.Widget createAndBindUi(final com.example.ApplicationView owner) {
    return new Widgets(owner).some_generated_method();
  }
}

Gördüğünüz gibi, bu sınıf görünümünüzde tanımladığınız Binder arayüzünü uygular. Görünümünüzden createAndBindUi öğesini aradığınızda, görünümünüzün örneğini bu yönteme iletirsiniz - bu, bu yöntemin tüm @UiField s, vb. bu alanlar özeldi, bu sınıf onlara erişemedi.

1
katma

UiBinder (ve iWn, ClientBundles vb. GWT'nin diğer birçok özelliği için), GWT derleyicisi görünümle aynı pakette ek bir Java sınıfı oluşturur. Bu sınıf görünümün alanlarına erişmek zorundadır (örneğin, bunları başlatmak için), bu nedenle paketin görünür olması gerekir (varsayılan olarak da bilinir). özel bu gereksinimi karşılamıyor.

Bunu bir örnek üzerinde görelim:

Bazı paketlerde ApplicationView.java var:

public class ApplicationView extends Composite {
    /* Needs to be package visible too */
    interface Binder extends UiBinder {
    }

    /* Doesn't matter what modifiers are here, but 
       it's usually static to give a hint to the GWT compiler
       that this field can be shared between instances of
       this class (like a, well, static)
    */
    private static Binder binder = GWT.create(Binder.class);

    @UiField Button button;

    public ApplicationView() {
        initWidget(binder.createAndBindUi(this));
    }
}

Aynı pakette, görünümünüzün nasıl düzenlendiğini tanımlayan ApplicationView.ui.xml 'si vardır.

Genelde görmediğiniz şey, GWT derleyicisinin her UiBinder görünümü için ek bir Java sınıfı oluşturmasıdır. Bu durumda, aynı kodda, ancak farklı bir kaynak klasörde ApplicationView_BinderImpl.java olur. Projenizi oluşturmak için ne kullandığınıza bağlı, ancak bunu temel aldığım bir maven projesi olması durumunda target/.generated konumundaydı.

Çok kısaltılmış bir biçimde, ApplicationView_BinderImpl şunun gibi görünebilir:

public class ApplicationView_BinderImpl implements UiBinder, com.example.ApplicationView.Binder {

  public com.google.gwt.user.client.ui.Widget createAndBindUi(final com.example.ApplicationView owner) {
    return new Widgets(owner).some_generated_method();
  }
}

Gördüğünüz gibi, bu sınıf görünümünüzde tanımladığınız Binder arayüzünü uygular. Görünümünüzden createAndBindUi öğesini aradığınızda, görünümünüzün örneğini bu yönteme iletirsiniz - bu, bu yöntemin tüm @UiField s, vb. bu alanlar özeldi, bu sınıf onlara erişemedi.

1
katma

UiBinder (ve iWn, ClientBundles vb. GWT'nin diğer birçok özelliği için), GWT derleyicisi görünümle aynı pakette ek bir Java sınıfı oluşturur. Bu sınıf görünümün alanlarına erişmek zorundadır (örneğin, bunları başlatmak için), bu nedenle paketin görünür olması gerekir (varsayılan olarak da bilinir). özel bu gereksinimi karşılamıyor.

Bunu bir örnek üzerinde görelim:

Bazı paketlerde ApplicationView.java var:

public class ApplicationView extends Composite {
    /* Needs to be package visible too */
    interface Binder extends UiBinder {
    }

    /* Doesn't matter what modifiers are here, but 
       it's usually static to give a hint to the GWT compiler
       that this field can be shared between instances of
       this class (like a, well, static)
    */
    private static Binder binder = GWT.create(Binder.class);

    @UiField Button button;

    public ApplicationView() {
        initWidget(binder.createAndBindUi(this));
    }
}

Aynı pakette, görünümünüzün nasıl düzenlendiğini tanımlayan ApplicationView.ui.xml 'si vardır.

Genelde görmediğiniz şey, GWT derleyicisinin her UiBinder görünümü için ek bir Java sınıfı oluşturmasıdır. Bu durumda, aynı kodda, ancak farklı bir kaynak klasörde ApplicationView_BinderImpl.java olur. Projenizi oluşturmak için ne kullandığınıza bağlı, ancak bunu temel aldığım bir maven projesi olması durumunda target/.generated konumundaydı.

Çok kısaltılmış bir biçimde, ApplicationView_BinderImpl şunun gibi görünebilir:

public class ApplicationView_BinderImpl implements UiBinder, com.example.ApplicationView.Binder {

  public com.google.gwt.user.client.ui.Widget createAndBindUi(final com.example.ApplicationView owner) {
    return new Widgets(owner).some_generated_method();
  }
}

Gördüğünüz gibi, bu sınıf görünümünüzde tanımladığınız Binder arayüzünü uygular. Görünümünüzden createAndBindUi öğesini aradığınızda, görünümünüzün örneğini bu yönteme iletirsiniz - bu, bu yöntemin tüm @UiField s, vb. bu alanlar özeldi, bu sınıf onlara erişemedi.

1
katma

bu alanları özel hale getiremezsiniz, bu durumda sonar kurallarını değiştirseniz daha iyi olur

0
katma

bu alanları özel hale getiremezsiniz, bu durumda sonar kurallarını değiştirseniz daha iyi olur

0
katma