什么是Java相当于Swift“扩展”?

时间:2015-06-19 16:44:18

标签: java swift swift-extensions

根据官方Swift文档(Swift extension doc),Swift扩展看起来像Java枚举。

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

1 个答案:

答案 0 :(得分:10)

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 }

这相当于之前的Swift扩展。

你可以这样使用它:

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