Подтвердить что ты не робот

Scala Усталость конструктора

У меня есть класс в 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 устаревание конструкторов, и если да, то как это делается?

4b9b3361

Ответ 1

Этот поток, как представляется, описывает решение:

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 ) 
}

Не могу попробовать прямо сейчас.

Ответ 2

В моем конкретном случае, когда отказ от конструктора вызывает предупреждение об устаревании во время компиляции из-за сопутствующего объекта с использованием устаревшего конструктора, коллега предложил мне предоставить второй конструктор, используя фиктивный параметр, и осудить тот, который отсутствует:

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 ) 
}

Это работает в том, что будут предупреждения только для устаревания, если пользователь вызывает устаревший конструктор, но, очевидно, это неприятно - у кого-то есть превосходное решение?