2016-10-11 4 views
0

Во время некоторых простых упражнений по кодированию scala я столкнулся с идеологической проблемой классов классов без параметров и дублирование параметров конструктора.Класс случая без параметров альтернативный

Все началось со следующими два довольно простых классов:

trait Namespace 

    case class Reply[T](namespace: Namespace, correlation: String, data: Try[T]) 

    abstract class Request(val namespace: Namespace, val id: String = UUID.randomUUID().toString) { 

    def success[T](data: T) = Reply(namespace, id, Try(data)) 

    def failure(msg: String) = Reply(namespace, id, Failure(new RuntimeException(msg))) 
    } 

Теперь давайте предположим, что у меня есть сущность Post, и я хочу, чтобы добавить All класс как команда запросить все записи типа Post. В моем текущем наборе вверх, было бы легче на самом деле написать следующее:

case class All extends Request(Posts) 

Однако в этом случае я получаю компилятор предупреждает, что случае классы без параметров являются устаревшими. Таким образом, можно было бы предложить, чтобы переписать его в следующем:

case object All extends Request(Posts) 

Однако в этом случае объект все будет реализованным только один раз вместе с id области, которые хотели бы избежать , имеющих уникальный идентификатор для каждого запроса.

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

Заранее спасибо?

ответ

5

Фактическое предупреждение, что

случае классов без списка параметров не допускается; используйте либо случай объекты или классы case с явным `() 'как список параметров.

Так дайте этот класс пустой список параметров, так же, как это было предложено компилятором:

case class All() extends Requests(Posts) 
+0

Большое спасибо за ответ – tkachuko

0

Не используйте case class или case object, просто используйте вместо этого компаньон. Вы все равно не хотите, чтобы объект был здесь, если вам нужен уникальный идентификатор для каждого запроса.

class All extends Requests(Posts) 

object All { 
    def apply(): All = new All() 
} 

getPosts(All()) 
+0

Большое спасибо за ответ, однако, как насчет равенства? В случае класса case я получаю бесплатные значения (==). В этом случае от меня требуется указать код. – tkachuko

+0

Также как насчет сериализации? В случае класса я бы тоже получил его бесплатно – tkachuko

+0

@tkachuko Для чего они нужны? Делайте их вручную, если вам нужно. – flavian