13

我在 Scala 中有一个类,目前以标准方式构建:

class Test( int : Int )
{
    override def toString() = "Test: %d".format( int ) 
}

但是,我想通过伴随对象转到间接构造。由于我正在修改的库被其他人使用,我不想立即将构造函数设为私有。相反,我想弃用它,然后在人们有机会改变他们的使用方式后返回并将其设为私有。所以我像这样修改了我的代码:

object Test
{
    def apply( int : Int ) = new Test( int )
}

@deprecated( "Don't construct directly - use companion constructor", "09/04/13" )
class Test( int : Int )
{
    override def toString() = "Test: %d".format( int ) 
}

但是,这会弃用整个类。

scala> Test( 4 )
<console>:10: warning: class Test in package foo is deprecated: Don't construct directly - use companion constructor
       val res0 =
           ^
res0: com.foo.Test = Test: 4

有谁知道 Scala 是否支持弃用构造函数,如果支持,它是如何完成的?

4

2 回答 2

10

该线程似乎描述了解决方案:

object Test
{
    def apply( int : Int ) = new Test( int )
}


class Test @deprecated( "Don't construct directly - use companion constructor", "09/04/13" ) ( int : Int )
{
    override def toString() = "Test: %d".format( int ) 
}

不过现在还不能试。

于 2013-04-09T08:40:14.180 回答
1

就我的特殊情况而言,由于伴随对象使用了已弃用的构造函数,因此弃用构造函数会导致编译时出现弃用警告,一位同事建议我使用虚拟参数提供第二个构造函数,并弃用没有的构造函数:

object Test
{
    def apply( int : Int ) = new Test( int, false )
}


class Test ( val int : Int, dummy : Boolean )
{
    @deprecated( "Don't construct directly - use companion constructor", "09/04/13" )
    def this( int : Int ) = this( int, false )

    override def toString() = "Test: %d".format( int ) 
}

这是可行的,因为如果用户调用已弃用的构造函数,只会有弃用警告,但显然这很不愉快 - 有没有人有更好的解决方案?

于 2013-04-09T09:43:06.603 回答