2014-05-03 84 views
1

我很抱歉的措辭不好的標題,但我找不到更好的方式來描述我的問題。我可以設置一個班級= 8

我正在製作一個自定義Degree類,它只能保存0到360之間的任何數字,任何更高的添加將被解析爲0-360當量。我想知道是否有可能做什麼原始類型我做我詮釋= 1。

我懷疑這是可能的,但如果是這樣,我該怎麼辦呢?

+1

'Int'不是java中的類型。只有一個'Integer'類和一個原始類型'int'。 Java是區分大小寫的:) – vikingmaster

+0

不,這在java中是不可能的,因爲自動裝箱只適用於內置數值類型,並且沒有隱式構造函數。 – Dave

+0

@Dave - 當然這是可能的。他們只需要製作自己的包裝類。 –

回答

2

這就是你所描述的在Java中看起來像。你將不得不創建一個包裝類來代表你的學位。但是,在內部,我們只會使用一個Integer對象(或者int原語可以正常工作)。

public class Degree { 

    private Integer degrees; 

    // Constructor, takes an Integer object or int primitive 
    public Degree(Integer deg){ 
     setDegrees(deg); 
    } 
    // Get degrees from your wrapper object 
    public Integer getDegrees(){ 
     return degrees; 
    } 
    // Set degress of your wrapper object 
    public void setDegrees(Integer deg){ 
     if(deg<361 && deg>-1){ degrees = deg; } 
     else if(deg>360){ degrees = 360; } 
     else if(deg<0){ degrees = 0; } 
    } 
} 

要在其他地方的代碼中使用此代碼,

Degree d = new Degree(31); 

你可能會想override the toString(); method還有equals();方法,爲便於使用新Degree類。我希望這有幫助。


編輯:,你聲明一個類,並使用=運營商宣佈它原始的被稱爲自動裝箱行爲。自Java 5以來一直可行的行爲,但僅適用於Java 5 specification中定義的包裝類的預先設置列表。

這份名單包括BooleanByteShortCharacterIntegerLongFloatDouble

+1

謝謝,這已經是我已經做的很多了。 –

+0

我會建議一個工廠方法而不是構造函數,比如數字類型''valueOf'。這使得你可以自由地獲得緩存值,比如0,90等,或者創建緩存。當然,你的班級需要是不可改變的,但無論如何,這是一個很好的做法。 – Dave

+0

你有doulbe代碼,在你的構造函數中你可以調用setDegrees(deg);並刪除雙重代碼。 –

1

我決定我會在這裏發佈我的成品班,以防萬一任何人想要參考。

public class Degree extends Number implements Comparable<Degree>{ 

    float degreeFloat; 

    public Degree(){ 
     degreeFloat = 0; 
    } 

    public Degree(float degrees){ 
     this.set(degrees); 
    } 

    public Degree(int degrees){ 
     this.set(degrees); 
    } 

    public Degree(Degree degrees){ 
     this.set(degrees); 
    } 

    @Override 
    public int intValue() { 
     return (int)degreeFloat; 
    } 

    @Override 
    public long longValue() { 
     return (long)degreeFloat; 
    } 

    @Override 
    public float floatValue() { 
     return degreeFloat; 
    } 

    @Override 
    public double doubleValue() { 
     return (double)degreeFloat; 
    } 

    @Override 
    public int compareTo(Degree compTo) { 
     if(compTo.get() > degreeFloat) 
      return 1; 
     else if(compTo.get() < degreeFloat) 
      return -1; 
     else 
      return 0; 
    } 

    public Boolean equals(Degree compTo){ 
     if(degreeFloat == compTo.get()) return true; 
     else return false; 
    } 

    public float get(){ 
     return degreeFloat; 
    } 

    public void set(Degree setTo){ 
     this.degreeFloat = setTo.get(); 
    } 

    public void set(float setTo){ 
     this.degreeFloat = setNormalise(setTo); 
    } 

    public void set(int setTo){ 
     this.degreeFloat = setNormalise((float)setTo); 
    } 

    public void set(double setTo){ 
     this.degreeFloat = setNormalise((float)setTo); 
    } 

    public float setNormalise(float setTo){ 
     float value = setTo; 

     while(setTo > 360f) 
      setTo -= 360F; 

     while(setTo < 0f) 
      setTo += 360f; 

     return value; 
    } 
} 
+1

一些評論,因爲你已經發布了這個;你不需要爲int/float/double重載版本;只是提供浮動,因爲這是你存儲什麼反正(隱式轉換將滿足int和它的價值大約警告兩倍)。 'new Degree(0).equals(new Degree(360))'將返回'false'(實際上你在'setNormalise'中有一個錯字,這意味着它永遠不會正常化)。而你的compareTo不是全方位感知的(所以361 <359)。當然,讓它全面瞭解是不可能的,但也許這意味着你不應該允許它? – Dave

+0

我還要指出的是,你的equals函數並不總是使用(例如,如果放在一個組或地圖),因爲它應該採取的對象不是一個學位(使用@Override標註它,你將被警告這個)。另外我強烈推薦使類不可變的(使degreeFloat最終並刪除setter方法),這將使其更加安全的其他對象中使用類型(不能改變外部所以不需要做保護副本)。抱歉給你扔這樣的清單,但這些都是我認爲值得注意的常見陷阱! – Dave

+0

兩個好點,我會做出改變 –

相關問題