Кластеры
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[]
.