2016-05-25 7 views
-1

Java Specによると、デフォルトのコンストラクタを使用すると、1つを定義しない場合、コンパイラによって提供されていない、引数を持つコンストラクタです:プライベートコンストラクタはデフォルトのコンストラクタですか?

Java言語仕様

8.8。 9。デフォルトのコンストラクタ

クラスにコンストラクタ宣言が含まれていない場合、デフォルトコンストラクタが暗黙的に宣言されます。トップレベルのクラス、メンバクラス、またはローカルクラスのデフォルトコンストラクタの形式は、次のとおりです。

デフォルトのコンストラクタは、クラス(6.6)と同じアクセシビリティを持ちます。

デフォルトのコンストラクタには非公開の内部メンバークラス以外の仮パラメータはありません。デフォルトのコンストラクタは、クラスのすぐ上にくるインスタンスを表す仮パラメータを暗黙的に宣言します(§8.8.1、§15.9.2、 §15.9.3)。

デフォルトコンストラクタにはスロー句がありません。

宣言されているクラスが基本クラスObjectの場合、デフォルトのコンストラクタには空の本体があります。それ以外の場合、デフォルトのコンストラクタは引数なしでスーパークラスのコンストラクタを呼び出すだけです。私はメソッドを作成し、静的を抽出することに決めました、いくつかのJAXBマッピングと協力して、IDEたが、私はいつも、今日、それはまたパブリックコンストラクタする必要があると思ったが、き

私のコンストラクタは自動的に私的なものになりました。

編集

だから私は、私はもう引数なしのコンストラクタを必要としないことに気付きましたし、それを削除しました。

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions 
org.yourproject.YourClass does not have a no-arg default constructor. 

JAXBはプライベート引数なしのコンストラクタで作業を行いますが、私はそれを削除すると、引数なしのデフォルトコンストラクタを求めて上記のエラーメッセージが記録されますので、JAXBには、次のメッセージをログに記録動作を停止しました。

私の質問は:プライベートの引数なしのコンストラクタとも呼ばれるデフォルトのコンストラクタ

@XmlRootElement(name = "getagentstatus") 
public class EccpGetAgentStatusRequest extends EccpAbstractRequest { 

    public static EccpGetAgentStatusRequest create(String agentNumber) { 
     return new EccpGetAgentStatusRequest(agentNumber); 
    } 

    @XmlElement(name = "agent_number") 
    private String agentNumber; 

    private EccpGetAgentStatusRequest() { 
    } 

    private EccpGetAgentStatusRequest(String agentNumber) { 
     this.agentNumber = agentNumber; 
    } 
} 

要求ラッパー::ここで

は私のJAXBマッピングが(ゲッターとセッターは省略)です

@XmlRootElement(name = "request") 
public class EccpRequestWrapper { 

    @XmlAttribute 
    private Long id; 

    @XmlAnyElement 
    private IEccpRequest request; 

    public void setRequest(IEccpRequest request) { 
     this.id = request.getId(); 
     this.request = request; 
    } 
} 

、ここで私のテストコードは次のとおりです。

public class Test { 

    public static void main(String... args) { 
     try { 
      EccpGetAgentStatusRequest wrapped = EccpGetAgentStatusRequest.create("Agent/1000"); 
      EccpRequestWrapper requestWrapper = new EccpRequestWrapper(); 
      requestWrapper.setRequest(wrapped); 
      JAXBContext jc = JAXBContext.newInstance(EccpRequestWrapper.class, wrapped.getClass()); 
      Marshaller marshaller = jc.createMarshaller(); 
      marshaller.marshal(requestWrapper, System.out); 
     } catch (JAXBException ex) { 
      ex.printStackTrace(); 
     } 
    } 

} 
+2

_第3版_ ?! [最新版](http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.8.9)を参照してください。 _デフォルトコンストラクタは、class_と同じアクセシビリティを持ちます。 –

+0

Ok @Sotirios Delimanolis、現在に更新されました。しかし、あなたのコメントは私の質問に答えるものではありません。あなたはそれを再び読むことができますか? – Jaumzera

+0

_そして、IDEは私のコンストラクタを自動的に私的なものにしています_それはコンパイラによって提供されておらず、デフォルトのコンストラクタでもありません。しかし、私はXMLデシリアライザが何か「public」を探していて、誤解を招くエラーメッセージがあると思います。 –

答えて

2

JAXBはありませんが必要オブジェクトを作成するためにリフレクションで呼び出せる-argsコンストラクタ。 JAXBは、アクセシビリティをtrueに設定しているため、コンストラクタへのアクセスが何であるか気にしません。したがって、コンストラクタを指定しない場合、JAXBはクラスにデフォルトのコンストラクタが与えられているので問題ありません。独自のプライベートな引数なしのコンストラクタを書く場合、JAXBもそれで問題ありません。 1つ以上の引数を取る独自のコンストラクタを提供し、引数なしコンストラクタを指定しない場合、そのクラスに対してデフォルトのコンストラクタは作成されず、JAXBはそのクラスのオブジェクトを作成できません。

用語集「デフォルトのコンストラクタ」は、引用符付きのJLS文で定義されています。指定しないとコンパイラが提供するコンストラクタにのみ適用されます。そうでない場合は、この用語を使用することは不正確に見えます。

+0

@Nathan Hughesありがとう、まずは私のことを理解してください。 JAXBのドキュメントがあるかどうか知っていますか? – Jaumzera

+0

@Jaumzera:私はそうではありません、私はそれがHibernateと同様に、そのクラスがどんな慣習に従わなければならないかを文書化していると思います。 –

関連する問題