2013-12-17 1 views
1

Я пытаюсь предоставить API-интерфейс оболочки Scala для Java API, который имеет типы возвращаемого типа. В частности, я хочу, чтобы моя Scala полагалась на AnyVal экземпляров как можно больше, чтобы уменьшить выделение.Разработка API-интерфейсов Fluent в мире Scala с помощью AnyVals и наследования с помощью implicits

Я нашел simple solution, который расслабляет эти текущие возвращения, но проблема в том, что WriteStream не может вернуть тип фактического типа, который он вызывается, поэтому не смог бы вызвать методы AsyncFile после вызова write.

alternative solution требует обертки с определением класса типа, который может возвращать тип вызываемого объекта, но мне не удалось полностью его обработать. Во-первых, я не могу, возможно, получить неявную переменную, которая будет выбрана и передана методу write(). Во-вторых, я не думаю, что мои неявные оболочки правильно определены, потому что мне нужна оболочка, которая использует JavaWriteStream, а Out - AsyncFile. Таким образом, похоже, что мне понадобится оболочка для каждой возможной комбинации этого неявного наследования, и, честно говоря, это выглядит сложным для того, что ему нужно делать.

Идея разделения WriteStream и AsyncFile заключается в том, что у вас есть несколько классов, наследующих (чтение: неявные преобразования) из WriteStream, и это позволяет избежать репликации каждого метода WriteStream в других расширяющихся классах.

Наконец, мне также интересно, стоит ли пытаться придерживаться этого безупречного стиля - это лучшее, что можно сделать в мире Scala, или есть альтернативные способы решения этой проблемы более элегантным способом в мире Scala. Scala Future's andThen продолжения приходит мне на ум как лучший способ конкатенации звонков, но там есть одна черта.

+2

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

+0

Как и FYI, 'andThen' на' Future' является чисто побочным эффектом и не влияет на результат. Если вы хотите объединить фьючерсы вместе и постоянно изменять результат по всей цепочке, используйте вместо этого такие вещи, как «map» и «flatMap». – cmbaxter

+0

Спасибо за отзыв. В конце концов я нашел [решение] (https://gist.github.com/galderz/bbd07b608ace868d4794) для этого, но пока не буду применять его, пока не найдутся проблемы с производительностью. –

ответ

0

В конечном счете выяснено, the code, чтобы сделать эту работу.

 Смежные вопросы

  • Нет связанных вопросов^_^