我很抱歉的措辭不好的標題,但我找不到更好的方式來描述我的問題。我可以設置一個班級= 8
我正在製作一個自定義Degree類,它只能保存0到360之間的任何數字,任何更高的添加將被解析爲0-360當量。我想知道是否有可能做什麼原始類型我做我詮釋= 1。
我懷疑這是可能的,但如果是這樣,我該怎麼辦呢?
我很抱歉的措辭不好的標題,但我找不到更好的方式來描述我的問題。我可以設置一個班級= 8
我正在製作一個自定義Degree類,它只能保存0到360之間的任何數字,任何更高的添加將被解析爲0-360當量。我想知道是否有可能做什麼原始類型我做我詮釋= 1。
我懷疑這是可能的,但如果是這樣,我該怎麼辦呢?
這就是你所描述的在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中定義的包裝類的預先設置列表。
這份名單包括Boolean
,Byte
,Short
,Character
,Integer
,Long
,Float
,Double
。
謝謝,這已經是我已經做的很多了。 –
我會建議一個工廠方法而不是構造函數,比如數字類型''valueOf'。這使得你可以自由地獲得緩存值,比如0,90等,或者創建緩存。當然,你的班級需要是不可改變的,但無論如何,這是一個很好的做法。 – Dave
你有doulbe代碼,在你的構造函數中你可以調用setDegrees(deg);並刪除雙重代碼。 –
我決定我會在這裏發佈我的成品班,以防萬一任何人想要參考。
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;
}
}
一些評論,因爲你已經發布了這個;你不需要爲int/float/double重載版本;只是提供浮動,因爲這是你存儲什麼反正(隱式轉換將滿足int和它的價值大約警告兩倍)。 'new Degree(0).equals(new Degree(360))'將返回'false'(實際上你在'setNormalise'中有一個錯字,這意味着它永遠不會正常化)。而你的compareTo不是全方位感知的(所以361 <359)。當然,讓它全面瞭解是不可能的,但也許這意味着你不應該允許它? – Dave
我還要指出的是,你的equals函數並不總是使用(例如,如果放在一個組或地圖),因爲它應該採取的對象不是一個學位(使用@Override標註它,你將被警告這個)。另外我強烈推薦使類不可變的(使degreeFloat最終並刪除setter方法),這將使其更加安全的其他對象中使用類型(不能改變外部所以不需要做保護副本)。抱歉給你扔這樣的清單,但這些都是我認爲值得注意的常見陷阱! – Dave
兩個好點,我會做出改變 –
'Int'不是java中的類型。只有一個'Integer'類和一個原始類型'int'。 Java是區分大小寫的:) – vikingmaster
不,這在java中是不可能的,因爲自動裝箱只適用於內置數值類型,並且沒有隱式構造函數。 – Dave
@Dave - 當然這是可能的。他們只需要製作自己的包裝類。 –