什么是Java相当于Swift"扩展"?

kal*_*lan 4 java swift swift-extensions

根据Swift官方文档(Swift扩展文档),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"
Run Code Online (Sandbox Code Playgroud)

我试图在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
Run Code Online (Sandbox Code Playgroud)

nce*_*ezo 10

Swift扩展与枚举无关.它们提供了一种扩展您可能甚至没有源代码的类的方法.例如:

extension Double {
    func multiplyBy2() {
         return self * 2
    }
}
Run Code Online (Sandbox Code Playgroud)

这将使函数multiplyBy2可用于任何Double实例的整个应用程序,因此您可以简单地执行以下操作:

let myDouble: Double = 2.0
NSLog( "myDouble * 2: \(myDouble.multiplyBy2())" );
Run Code Online (Sandbox Code Playgroud)

您可以根据需要在课程中添加尽可能多的扩展.扩展允许您添加方法和计算属性,但不允许存储属性.但这可以通过使用Objective-C运行时来实现.

Java不支持这种行为.

但是,Groovy(一种基于Java的动态语言在JVM上运行)长期以来一直支持这种行为.使用groovy,您可以通过将闭包作为属性添加到metaClass来动态扩展类(非常类似于向JavaScript对象添加方法的方式).

例如:

Double.metaClass.multiplyBy2 = { return delegate * 2 }
Run Code Online (Sandbox Code Playgroud)

这相当于之前的Swift扩展.

你可以这样使用它:

Double myDouble = 2.0
println "myDouble * 2: ${myDouble.multiplyBy2()}"
Run Code Online (Sandbox Code Playgroud)