2017-05-03 8 views
1

編集:以前の質問に申し訳ありませんが、の最終キーワードはあなたを混乱させるでしょう、それは適切ではありません。そして私の貧しい人の英語にも申し訳ありません。フィールドがコンストラクタから初期化されていることを確認

-----質問------

は、私は多くの異なったロジック内でそれを初期化する必要があるので、私は、任意のコンストラクタなしモデルクラスを持っていると仮定します。 しかし、私はnotnullキーワードを持っています。

public class Model { 
    public notnull String name; 
    public notnull String address; 
    public notnull int age; 
} 

そして、私は別の場所にそれを使用するが、すべてのにnotnullフィールドはどのようにすることができ

Model m = new Model(); 
m.name = "Hello"; 
m.age = 15; 
// syntax error, you should set Model.address 

それとも

Model m1 = new Model(); 
m1.address = "World"; 
m1.age = 20; 
// syntax error, you should set Model.name 

コンパイル時にを初期化されたかどうかをチェック維持する必要がありますJavaでそれを達成する? Thx。

+2

私は混乱しています。それらが最終的なものであれば、それらをすべてコンストラクタで初期化する必要があります。 –

+1

'final String a =" A "'として宣言した場合は、各コンストラクタで 'a =" A "'またはインスタンス初期化子ブロック内で '{a =" A "}'として初期化する必要があります。それ以外の場合は、コンパイル時エラーが発生します。あなたが現在行っているやり方では、 'final'を設定する必要はありません。あなたが初期化する必要がないので、' final'が矛盾するでしょう。 – SomeJavaGuy

+1

と "しかし、私は新しいキーワードsay notnull" lolを持っています。 –

答えて

0

Builderパターンを見てください。あなたはそれを使用する方法についてインターネット上で見つけることができる記事の数があります。これは一例ですhttps://jlordiales.me/2012/12/13/the-builder-pattern-in-practice/です。 Builderパターンを使用すると、特定のフィールドが設定されているかどうかを検証し、存在しない場合は例外をスローできます。

+0

これはおそらくまだJavaの基礎を学んでいる人にとっては適切な答えではありません。 – ajb

+0

@ajb実際、JSONパーサー、HTTPサーバー、および純粋なJavaで自分自身で構築された他の多くのツールに似ています。私はそれが私が思う基本的な質問ではないことを意味します; - P –

+0

@ tabiulあなたの答えをありがとう、私は文法レベルのソリューション(コンパイル時にチェックイン)を期待しています。あなたの答えは実際にはファクトリデザインパターンです。つまり、別のクラスを書く必要があります。コンパイル時にチェックインしません。 –

2

は、私はこれが不可能である任意のconstractor

なしモデルクラスを持っていると仮定します。すべてのクラスにはコンストラクタがあります。定義していない場合は、デフォルトコンストラクタで終わります。あなたのケースでは:

public Model() { 
    super(); 
} 

すべての最後のフィールドが

が最初に初期化されたかどうかをチェックする、finalフィールドは、そうでない場合、コンパイラはコンパイルされません、初期化する必要があります。したがって、あなたが最終的なフィールドを初期化するために持っている必要があり、次のいずれかの最終フィールド

コンストラクタの初期化

public final String name; 
public final int age; 

public Model() { 
    this.name = "Hello"; 
    this.age = 13; 
} 

宣言初期

を宣言するとき、コンストラクタ
    • public final String name = "Hello"; 
      public final int age = 13; 
      
      public Model() { 
          super(); 
      } 
      
  • 0

    最終的な場合: コンストラクタ内で宣言またはインスタンス化する場所でインスタンス化することができます。

    final + staticの場合: 宣言した場所でインスタンス化する必要があります。

    静的でないので、指定した場所またはコンストラクタでインスタンス化する必要があります。

    1

    あなたははこのような何かをしたいためにだものを達成することができます

    public class Model { 
        private final String name; 
        private final String address; 
        private final int age; 
    
        public Model(final String name, final String address, final int age) { 
         if (name == null) { 
          throw new IllegalArgumentException("please provide a name"); 
         } 
         if (address == null) { 
          throw new IllegalArgumentException("please provide an address"); 
         } 
         this.name = name; 
         this.address = address; 
         this.age = age; 
        } 
    
        // getters 
    } 
    

    使用法:

    new Model("World", "Some address", 20) // OK 
    new Model("World", null, 20) // Exception because null address. 
    
    0

    は私がする必要があるので、私はどのコンストラクタなしモデルクラスを持っていると仮定 多くの異なるロジック内で初期化します。しかし、私はnotnull キーワードを持っています。あなたが任意のコンストラクタを書かない場合でも、コンパイラが自動的にデフォルト値にオブジェクト内のすべてのフィールドを初期化しますデフォルトの引数なしのコンストラクタ(すなわち、Stringを提供することに注意する必要があり

    ゼロ値へnullint種類のタイプ、等。)


    クラスのコンストラクタは、すべての必須フィールドが提供またはされていない検証するための適切な場所ですので、レコード生成電子は、オブジェクトの作成時に渡されるすべての必須フィールドをチェックするために、独自のコンストラクタ:

    public class Model { 
        private String name; 
        private String address; 
        private int age; 
    
        public Model(String name, String address, int age) { 
         if(name == null) { 
           throw new IllegalArgumentException(" Name is mandatory "); 
         } 
         if(address == null) { 
           throw new IllegalArgumentException(" Address is mandatory "); 
         } 
         if(age < 0) { 
           throw new IllegalArgumentException(" Age is Invalid "); 
         } 
         this.name = name; 
         this.address = address; 
         this.age = age; 
        } 
        //Add getters and setters 
    } 
    

    はまた、は、(上記のよう)あなたのフィールドprivateをマークすることにより、データをあなたのModelクラスのをカプセル化します。

    関連する問題