Преобразование содержимого объекта пакета из Scala в Java - PullRequest
2 голосов
/ 02 июля 2019

У меня неудачная задача по преобразованию сетевой библиотеки, которую я написал пару лет назад, из scala в java из-за нехватки оффшорных scala ресурсов.

Одна из хитростей: конвертацияpackage объект и его type aliases и case classes.Вот выдержка:

package object xfer {

  type RawData = Array[Byte]
  type DataPtr = String

  type PackedData = RawData
//  type PackedData = (DataPtr, RawData, RawData)
//  type UnpackedData = (DataPtr, Any, RawData)
  type UnpackedData = Any

  case class TaggedEntry(tag: String, data: Array[Byte])

  case class TypedEntry[T](tag: String, t: T)

  case class XferWriteParams(tag: String, config: XferConfig, data: RawData, md5: RawData) {

    override def toString: DataPtr = s"XferWriteParams: config=$config datalen=${data.length}} md5len=${md5.length}}"
  }

Например, RawData имеет 32 использования.Я полагаю, что одним из подходов может быть простой Найти / Заменить из всех 32 экземпляров на byte[]: но есть ли более элегантный способ?

Для case class.Я опасаюсь создания еще нескольких файлов верхнего уровня в этом пакете для каждого из них, а также еще нескольких файлов верхнего уровня в каждом из дюжины других пакетов ... но есть ли альтернатива?

1 Ответ

2 голосов
/ 03 июля 2019
Кластеры

ADT-esque trait-case-class типа

trait T
case class C1 extends T
case class C2 extends T

могут быть преобразованы в абстрактный базовый класс T с вложенными статическими классами C1, C2:

abstract class T {
  static class C1 extends T { ... }
  static class C2 extends T { ... }
}

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

Для псевдонимов типов вы можете рассмотреть возможность их преобразования в полноценные классы-оболочки, ноВы должны быть очень осторожны при создании таких классов, как RawData, используя == / equals, hashCode или помещая их в HashSet s или HashMap s.Нечто подобное может сработать:

class RawData {
    private final byte[] value;
    public RawData(byte[] v) { ... }
    public byte[] getValue() { ... }

    public static RawData of(byte[] value) {
      return new RawData(value);
    }

    @Override public int hashCode() {
        return value.hashCode();
    }
    @Override public boolean equals(Object other) {
        if (other instanceof RawData) {
            return value.equals(((RawData) other).value);
        } else {
            return false;
        }
    }
    @Override public String toString() {
        return String.valueOf(value);
    }
}

Это позволит сохранить сигнатуры похожими и даже может повысить безопасность типов до некоторой степени.В случаях, когда это действительно критично для производительности, я бы предложил просто найти / заменить все вхождения на byte[].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...