2011-12-07 9 views
1

における整数の範囲を設定し、私は属性があります。私はそれが唯一の値の間になるように、この数を制限したいJavaの

private int Number; 

を1 - 3

私はこれを行うだろうメソッド内で値を設定するか、値1〜3をこの整数の有効な値にしたいという事前定義の方法がありますか?

事前に感謝します。

編集:

1から3の間の数字を入力したいと思います。

私はwhileループ、doループ、forループを使用してみましたが、それぞれ無限ループに陥ることなく動作することができません。

ここにいくつかのサンプルコードは次のとおりいくつかの言語(例えば、ADA)とは異なり

private int Number; 

    public void setNumber(int aNumber) { 
     int count = 1; 
     while (count !=0) { 
      if ((aNumber < 1) || (aNumber > 3)) { 
       System.out.println("Value is out of range 1-3"); 
       System.out.println("Please try again"); 
       break; 
      } 
      else { 
       this.Number = aNumber; 
       count = 0; 
      } 
    } 
} 
+0

私には2つの質問があります。 1:そのループは私が見る限り限り無限に動くべきではありません。あなたはいつ無限ループをしていますか? 2.ループが何度も実行されることはないので、なぜそのループが存在するのでしょうか?あなたは何をしようとしましたか? –

+0

基準を満たしていない番号(1-3の間)を入力すると、「値が範囲外または範囲1-3」「無限にループします」「再試行してください」という印刷出力があります。 私自身のコードを読むことは、それが= < 1 || =>であるはずですか? – silverzx

+0

ループは常に終了するため、条件は関係ありません。 'break'dまたは' count'が0に設定されて停止するかのいずれかです。別のループから 'setNumber'を呼び出しますか?それが壊れていると、無限を引き起こす可能性があります。 –

答えて

4
public void setAnumber(int value) { 
    if ((value < 1) || (value > 3)) 
     throw new IllegalArgumentException("value is out of range for anumber"); 
    this.anumber = value; 
} 
+3

私は、否定版の 'if((1 <= value)&&(value <= 3))'を好むでしょう。より読みやすく - 設定が最初に来ます。例外は 'else'節です。 –

+0

比較演算子を後方に持っていると読みやすくなります。 –

+0

私はあなたがYuvalを意味することを願っています。私は私のことが正しいと思います。私は値が範囲内に収まらない場合にのみ例外をスローします。 – duffymo

11

は、Javaは「先行宣言」数の許容範囲をする方法を持ちません。あなたがクラスにanumberをカプセル化する場合は、あなたがセッターメソッド使用して、このような制限を強制することができます

class RestrictedRangeExample { 
    private int anumber; 

    public void setAnumber(int newanumber) { 
     if (newanumber >= 1 && newanumber <= 3) { 
      anumber = newanumber; 
     } else { 
      throw new IllegalArgumentException("anumber out of range"); 
     } 
    } 
} 
+0

これは必要ではありません。いくつかの構文解析プログラム(アノテーションやJavaエージェントを扱う)を使うことができます。 google lib cofoja:http://code.google.com/p/cofoja/ – korifey

+4

この場合、cofojaは不要だと思います。 –

+0

これは1)そのような範囲変数の数2)例外またはアサーションエラーをスローする必要があるかどうか(このロジックがプライベートな場合) – korifey

-2

ありませんが、しかし、あなたはセッターのための内部の制約を強制Googleのグアバ

+0

Rangeクラスは述語の実装です。その場合は、ミューテータ内であれば単純です。 Greg Hewgillの答えを見てください。 –

4

からRangeを使用することができますこの属性は確実に機能します。もう1つのことは、あなたの宿題の制約に応じて、整数の代わりに列挙を使うことです。

+0

+1は宿題の制約を認識しています –

1

残念ながらjava.lang.Integerはfinalであるため、拡張することはできません。いつでもクラスLimitedIntegerを実装し、そこにこのロジックを実装することができます。

しかし、あなたが本当に必要なのはバージョン1.5以降でJava言語でサポートされているenumです。

0

Integer(int)には制約がありません。唯一のものは、32ビットセットのカーディナリティによって境界が決まる最小値と最大値です。 あなたが話している方法をアクセサと呼びます。アクセサーは、値を設定して取得するために使用されるメソッドです。このようにして、値を割り当てる前に任意の値を検証、フォーマット、または前処理できます。 あなたが簡単にあなたのアクセサ次のようコーディングすることができます。

import java.lang.Math.*; 
void setNumber(int aNumber) 
{ 
this.number = Math.min(3, Math.max(aNumber,1)); 
if (this.number != aNumber) throw new IllegalArgumentException("aNumber is out of range"); 
} 

int getNumber() 
{ 
return this.number; 
} 
1

をあなたはそれを達成することができる唯一の方法は、あなたが制限したい番号について独自のクラスをdefinigことです。しかし、私の経験に基づいて、あなたが探しているものは、限られた範囲の値を持つ整数ではありませんが、実際はenumです。

public enum MyNumber { 
    ONE(1), 
    TWO(2), 
    THREE(3); 

    private int value; 

    private MyNumber(int value) { 
    this.value = value; 
    } 

    public int getValue() { 
    return value; 
    } 
}