Другой вариант - определить поле как общедоступное (если хотите, финальное) в базовом классе, а затем инициализировать это поле в конструкторе базового класса, в зависимости от того, какой подкласс используется в настоящее время. Это немного сомнительно, поскольку вводит круговую зависимость. Но, по крайней мере, это не зависимость, которая когда-либо может измениться, то есть подкласс будет либо существовать, либо не существовать, но методы или поля подкласса не могут влиять на значение field
.
public abstract class Base {
public final int field;
public Base() {
if (this instanceof SubClassOne) {
field = 1;
} else if (this instanceof SubClassTwo) {
field = 2;
} else {
// assertion, thrown exception, set to -1, whatever you want to do
// to trigger an error
field = -1;
}
}
}