如何从Scala中为现有Java类实例调用公共静态方法?
尽管围绕这个话题有很多类似的问题,但我找不到合适的答案。这是关于常用的builder+实体方法,如ApacheCommonsCLI如何从Scala中为现有Java类实例调用公共静态方法?,java,scala,oop,static,Java,Scala,Oop,Static,尽管围绕这个话题有很多类似的问题,但我找不到合适的答案。这是关于常用的builder+实体方法,如ApacheCommonsCLIOptionBuilder+Option,以及相应的客户端代码迁移到Scala 代码中的插图: Java类: public class Entity { private int f1; private int f2; public Entity(int f1, int f2) { this.f1 = f1;
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类istance调用静态hasF2,并且存在问题
你知道应该如何妥善解决这个问题吗
更新:
说明所有力学的相关问题:
不返回任何内容
因为Builder.hasF1(5)
不返回任何内容,显然Scala找不到hasF2
修改hasF1:
static Builder hasF1(int f1) {
Builder.f1 = f1;
return Builder;
}
对别人也一样。你不能这样做。不能对Scala中的实例调用静态方法。事实上,这在Java中也被认为是一种不好的做法,但如果这就是您拥有的接口,那么除了构建一个完整的Scala包装器之外,您真的无能为力
现在,如果代码在您的控制之下,那么我只能说:不要这样做。如果你不相信我,那就去看看Joshua Bloch用有效的Java对它说了些什么。好的,在这种情况下,我们终于找到了以下Scala解决方案:
Builder.hasF1(5)
Builder.hasF2(10)
Entity entiry = Builder.create()
这清楚地表明原来的外部库设计不好。幸运的是,它是在应用程序开始时调用的,但我正在考虑重构这种情况,以支持直接
实体构造函数调用,因为它可能会产生副作用。Daniel,感谢您提供我调查的最后一点。这不在我的控制之下。事实上,在准备这个问题时,我终于找到了我的案例的解决方案,而你的观点可能是对一般问题的回答。:-)这是一个重复的地方,我刚才评论说OptionBuilder在trunk上不推荐使用。
Builder.hasF1(5)
Builder.hasF2(10)
Entity entiry = Builder.create()