1

'builder'クラスがあり、Sonarは次の警告を出します。

Missing Static Method In Non Instantiatable Class
pmd : MissingStaticMethodInNonInstantiatableClass
A class that has private constructors and does not have any static methods or fields cannot be used

上記のチェックを満たすために、このクラスをどのようにリファクタリングしますか?私はそのクラスを使用しているので、頭を悩ませています。

使用例:

ViewBuilder vb = new ViewBuilder.Builder()
    .modelPart(CONTENT_PAGE, contentPageDao.get(id))
    .modelPart("navigation_sections", navigationSectionDao.list() )
    .modelPart("available_tags", tagDao.list() )
    .modelPart("available_albums", albumDao.list() )
    .section(CONTENT_PAGE)
    .page("index")
    .element("form")
    .action("/admin/content_page/save/" + id + ".html")
    .build();

クラス自体:

import java.util.HashMap;
import java.util.Map;


 public final class ViewBuilder {

    private static final String ADMIN_LAYOUT = "admin/layout";
    private String layout = ADMIN_LAYOUT;
    private String section = "";

  private static Map<String, Object> viewParts = new HashMap<String, Object>();

  /**
   * @return the layout
   */ public String getLayout() {
    return layout;
  }

  /**
   * @param layout the layout to set
   */ public void setLayout(String layout) {
    this.layout = layout;
  }

  /**
   * @return the section
   */ public String getSection() {
    return section;
  }

  /**
   * @param section the section to set
   */ public void setSection(String section) {
    this.section = section;
  }

  public static class Builder{

    // required params
    private String layout;
    private String section;

    // optional params
    private Map<String, Object > viewParts = new HashMap<String, Object >();

    public Builder(){

        this.layout = ADMIN_LAYOUT;
        viewParts.put("layout", ADMIN_LAYOUT);

    }
    public Builder( String layout ){

      if( layout != null ){
        this.layout = layout;
        viewParts.put("layout", layout );
      } else {
        this.layout = ADMIN_LAYOUT;
        viewParts.put("layout", ADMIN_LAYOUT);
      }

    }// constructor
    public Builder modelPart( String val, Object o ){
      this.viewParts.put(val, o );
      return this;
    }

    public Builder action( String val ){
      this.viewParts.put("action", val);
      return this;
    }
    public Builder element( String val ){
      this.viewParts.put("element", val);
      return this;
    }
    public Builder section( String val ){
      this.section = val;
      this.viewParts.put("section", val);
      return this;
    }
    public Builder page( String val ){
      this.viewParts.put("page", val);
      return this;
    }
    public Builder layout( String val ){
      this.layout = val;
      return this;
    }

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


  }// Builder

    private ViewBuilder(Builder builder){
      this.section = builder.section;
      this.layout = builder.layout;

      viewParts = builder.viewParts;
    }

  /**
   * Get the value of viewParts
   *
   * @return the value of viewParts
   */
  public Map<String, Object> getViewParts() { return viewParts; }

  /**
   * Set the value of viewParts
   *
   * @param viewParts new value of viewParts
   */
  public void setViewParts(Map<String, Object> viewParts) { this.viewParts = viewParts; }
}
4

3 に答える 3

4

静的にネストされたビルダークラスのアクセサーを考慮に入れるには、SonarQubePMDルールを更新する必要があります。

このために作成されたPMDの問題がありますが、見捨てられているようです: http ://sourceforge.net/p/pmd/bugs/955/

このソナー違反を取り除くための「リファクタリング」には同意しません。ビルダーパターンはよく知られており、複雑なオブジェクトを作成するときに非常に役立ちます。「EffectiveJava」の第2章の項目2を 参照してください。http://www.informit.com/articles/article.aspx?p = 1216151&seqNum = 2

于 2015-03-25T17:32:06.253 に答える
1

このチェックを満たす別の方法は、コンストラクターをプライベートではなくプライベートにすることです。これの追加の利点は、コンパイラが内部クラスのパッケージプライベートアクセスを持つ追加の合成コンストラクタを生成する必要がなくなることです。内部クラスのプライベートメソッドに関する質問への回答を参照してください。

コンストラクターをプライベートに保つことを強く望んでいる場合は、同じパッケージ内の他のクラスでさえ、を使用せずにインスタンスを作成できないようにするために、次の方法Builder.build()でSonarの問題を抑制できるはずです。

// private constructor to enforce the use of Builder.build()
@SuppressWarnings("pmd:MissingStaticMethodInNonInstantiatableClass")
于 2018-04-04T15:38:44.533 に答える
0

publicネストされたBuilderクラスがとであることを考えると、ネストさstaticれていることにはほとんどメリットがありません。独自のトップレベルクラスに分割することをお勧めします。もちろん、それはPMDが不平を言っている理由ではありません。外部クラス、ViewBuilderには、パブリックコンストラクタも静的メソッドもありません。現在存在しているので、Builderクラスの周りにはかなり役に立たない「名前空間ラッパー」があります。コンストラクターを追加するか、完全に削除します。

于 2013-01-18T22:55:45.087 に答える