如何使用;“静态最终常数”;在Scala构造函数中?
我看到了这个问题:还有这个问题:但我不能让它工作 我想做的是Scala等效于以下Java代码:如何使用;“静态最终常数”;在Scala构造函数中?,scala,Scala,我看到了这个问题:还有这个问题:但我不能让它工作 我想做的是Scala等效于以下Java代码: public class MyClass extends AnotherClass{ public static final String WSDL = MyConfig.getProp("..."); public static final String SERVICES = {new QName(MyConfig.getProp("..."))}; public MyClass(){
public class MyClass extends AnotherClass{
public static final String WSDL = MyConfig.getProp("...");
public static final String SERVICES = {new QName(MyConfig.getProp("..."))};
public MyClass(){
super(WSDL,SERVICES);
}
}
根据我的搜索结果,我尝试的是:
class MyClass (wsdl: String, services: Array[QName])(implicit val config:MyConfigClass) extends AnotherClass(wsdl,services:_*){
val WSDL:String = config.getProp("...")
val SERVICES: Array[QName] = Array(new QName(config.getProp("...")))
def this() {
this(WSDL,SERVICES:_*)
}
}
但是Scala IDE告诉我WSDL和服务是未知的。此时声明WSDL和服务不应该等同于Java MyClass.WSDL访问吗
感谢您提供的任何解决方案,以及让我更容易理解scala的任何解释…scala没有
静态的。相反,您要做的是将在Java中生成的static
放在类的伴生对象中
您的代码应该是这样的:
class MyClass (wsdl: String, services: Array[QName])
extends AnotherClass(wsdl, services: _*) {
def this() {
this(MyClass.WSDL, MyClass.SERVICES)
}
}
object MyClass {
final val WSDL: String = "..."
final val SERVICES: Array[QName] = Array(new QName("..."))
}
谢谢,但在这种情况下,我有另一个问题。。。WSDL不仅仅是一个硬编码字符串,而是类似于config.getProp(“属性”),其中config是在我的应用程序对象中初始化的隐式值。由于我看到的对象不能用任何参数初始化,如何将配置值传递给伴随对象?我将编辑我的问题…@chelute在Java中如何使用静态最终变量?那么您也不能依赖传递给构造函数的内容。@Jasper-M您是对的,我现在的问题是配置实现。。好吧,这个解决方案是好的,所以!谢谢这不是100%等价:常量必须显式标记为final val
,即使它们通过在对象
或最终类
中声明而隐式标记为final
@Chelute Java的final
有多种含义,val
仅相当于其中一种含义,防止重新分配变量final
还可以使方法不可重写,类不可扩展。因此,final val
是在子类中不能重写的val
。