Для файлов ORC и последовательности BLOCK__OFFSET__INSIDE__FILE
не является уникальным для каждого файла, и в официальной документации говорится, что это смещение файла первого байта текущего блока
В [113 ] В некоторых ресурсах в Интернете сказано, что BLOCK__OFFSET__INSIDE__FILE является уникальным внутри текстовых файлов. Даже если это правда, почему вы должны ограничивать себя только текстовыми файлами.
Кроме того, UUID не зависит от входных файлов и может быть рассчитан после некоторого преобразования, в рабочем процессе, читающем тему Kaffka, вообще без файлов и т. Д. Также UUID, сгенерированный в какой-либо другой системе, также уникален в вашей системе, поскольку UUID глобально уникальный. Кроме того, идентификаторы UUID имеют одинаковую длину, не зависят от длины структуры файлового каталога, и INPUT__FILE__NAME
содержит все пути к файлам, что делает имя файла уникальным в одной и той же файловой системе.
Вот почему UUID является предпочтительным решением
Generics and covariant type overriding do not work very well together. You have to explicitly declare getTileClass() as returning a class that can be a subclass of A.Tile.
You also can access the class object of MyTile without instanciating it, with MyTile.class.
Try this instead:
public abstract class A {
public static interface Tile;
protected abstract Class<? extends Tile> getTileClass();
}
public class B extends A {
public static class MyTile implements A.Tile { }
@Override
protected Class<MyTile> getTileClass() {
return MyTile.class;
}
}
Even better would be to make A generic. You still have to use extends in the class type definition, but you can be a bit more specific:
public abstract class A<T extends A.Tile> {
public static interface Tile;
protected abstract Class<? extends T> getTileClass();
}
public class B extends A {
public static class MyTile implements A.Tile { }
@Override
protected Class<MyTile> getTileClass() {
return MyTile.class;
}
}
public abstract class A {
public static interface Tile {};
// I return something that is-a Tile
protected abstract Tile getTileClass();
}
public class B extends A {
public static class MyTile implements A.Tile { }
@Override
protected abstract Tile getTileClass() {
return new MyTile();
}
}
Нет необходимости в генериках, вы просто хотите сказать, что возвращаете подкласс Tile или Tile.
Между прочим, открытый статический интерфейс в классе - это «запах кода»; либо сделайте его защищенным, чтобы только подклассы A могли реализовать Tile, либо поместите его в собственный интерфейс верхнего уровня. Вставка, но позволяющая кому-либо это реализовать, отправляет смешанное сообщение.