2015-06-19 21 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()}"