[英]How to access a public static final member in a Java class from Scala?
[英]How to invoke public static method for existing Java class instance from Scala?
尽管围绕该主题存在很多类似的问题,但我找不到合适的答案。 这是关于常用的构建器+实体方法,例如Apache commons CLI OptionBuilder
+ Option
以及将相应的客户端代码迁移到Scala。
代码示例:
Java类:
public class Entity {
private int f1;
private int f2;
public Entity(int f1, int f2) {
this.f1 = f1;
this.f2 = f2;
}
}
public class Builder {
private static int f1 = 0;
private static int f2 = 0;
private static Builder instance = new Builder();
static Builder hasF1(int f1) {
Builder.f1 = f1;
return Builder.instance;
}
static Builder hasF2(int f2) {
Builder.f2 = f2;
return Builder.instance;
}
static Entity create() {
return new Entity(Builder.f1, Builder.f2);
}
}
使用这种方法的普通Java代码:
Entity entity = Builder.hasF1(5).hasF2(10).create();
如果将它“喂”到了scalac
它会抱怨Builder
没有hasF2
字段。 从我的调查来看,Scala可以毫无问题地将Builder.hasF1
方法定位为class level one
但是在此之后,它需要为现有的Java类距离调用static hasF2,这是有问题的。
任何想法应该如何正确解决?
更新:说明所有机制的相关问题: Scala错误编译OptionBuilder
你做不到。 您不能在Scala中的实例上调用静态方法。 而且,实际上,这在Java中也被认为是不好的做法,但是,如果这是您所拥有的接口,那么除了构建完整的Scala包装器之外,您实际上无能为力。
现在,如果该代码在您的控制之下,那么我只能说:不要这样做。 而且,如果您不信任我,请去看看Joshua Bloch在Effective Java中对此有何评论。
好的,在这种情况下,终于来到了以下Scala解决方案:
Builder.hasF1(5)
Builder.hasF2(10)
Entity entiry = Builder.create()
这清楚地表明原始外部库的设计不正确。 幸运的是,它在应用程序开始时就被调用了,但是由于潜在的副作用,我正在考虑将这种情况重构为直接的Entity
构造函数调用。
static Builder hasF1(int f1) {
Builder.f1 = f1;
}
不返回任何东西。
因为Builder.hasF1(5)
返回任何内容,所以显然Scala找不到hasF2
。
修改hasF1:
static Builder hasF1(int f1) {
Builder.f1 = f1;
return Builder;
}
并为他人做同样的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.