2015-06-19 79 views
3

根據Swift官方文檔(Swift extension doc),Swift擴展看起來像Java枚舉。什麼是Java相當於Swift的「擴展」?

Swift extensions: 

extension Double { 
var km: Double { return self * 1_000.0 } 
var m: Double { return self } 
var cm: Double { return self/100.0 } 
var mm: Double { return self/1_000.0 } 
var ft: Double { return self/3.28084 } 
} 

let oneInch = 25.4.mm 
print("One inch is \(oneInch) meters") 
// prints "One inch is 0.0254 meters" 

我試圖在Java中表示這一點,並提出了以下代碼。 這是Java的代碼是否正確?還是有任何其他方式來表達這一點?

public enum LengthMetric { 

km(1.0e3), mm(1.0e-3), m(1.0e0); 

private final double number; 

LengthMetric(double number) { 
    this.number = number; 
} 

double getValue(double value) { 
    return value * number; 
} 

public static void main(String[] args) { 


    double originalValueInMeters = 3.0; 

    System.out.printf("Your value on %s is %f%n", km, 
      km.getValue(originalValueInMeters)); 

    double oneInch = mm.getValue(25.4); 
    System.out.printf("One inch on %s is %f%n", m, 
      oneInch); 

} 
} 
Your value on km is 3000.000000 
One inch on m is 0.025400 
+0

斯威夫特有定期枚舉。這只是將新東西添加到Double類型中。與枚舉沒有太大關係。 – Mints97

+0

在Java中,考慮[tag:jscience]'javax.measure.converter'進行單位轉換。 – trashgod

回答

8

Swift擴展與枚舉無關。 它們提供了一種擴展可能甚至沒有源代碼的類的方法。 例如:

extension Double { 
    func multiplyBy2() { 
     return self * 2 
    } 
} 

這將使現有的功能multiplyBy2通過你的整個應用程序的任何Double實例,所以你可以簡單地這樣做:

let myDouble: Double = 2.0 
NSLog("myDouble * 2: \(myDouble.multiplyBy2())"); 

您可以在儘可能多的擴展如你所願。 擴展允許您添加方法和計算的屬性,但不能存儲屬性。但是這可以通過使用Objective-C運行時來實現。

Java不支持這種行爲。

但是,Groovy(一種基於Java的JVM上運行的動態語言)長期以來一直支持這種行爲。 使用groovy,您可以通過向metaClass添加閉包作爲屬性來動態擴展類(非常類似於可以將方法添加到JavaScript對象的方式)。

例如:

Double.metaClass.multiplyBy2 = { return delegate * 2 } 

這將是相當於以前的斯威夫特擴展。

你可以使用它則是這樣的:

Double myDouble = 2.0 
println "myDouble * 2: ${myDouble.multiplyBy2()}"