Вот короткая версия. Прежде всего: я хочу, чтобы мой класс был неизменным. Я знаю, что класс не может быть абстрактным и окончательным. Я спрашиваю: есть ли способ только позволяют внутренним классам расширять и реализовывать внешний, абстрактный класс? Возможно, это не лучший способ достичь моих неизменных целей, поэтому, если у кого-то есть лучший дизайн, я бы хотел его услышать.Как создать абстрактный, неизменный класс?
Я пишу класс для векторных операций - как в физике, так и в технике, а не в смысле программирования. (Я также знаю, что JScience has a package для такого рода вещей. Я хочу написать свой собственный и сохранить его простым.)
Мне нравится шаблон, используемый в пакете геометрии Java, где, например, можно создать Line2D
используя один из двух уровней точности: поплавок или двойной.
public abstract class Line2D {
public static class Float extends Line2D { /* Implementation */ }
public static class Double extends Line2D { /* Implementation */ }
}
Это особенность, которую я действительно хотел бы включить и расширить в своем классе, так что я создал следующее:
public abstract class Vector2D {
public final static class Integer extends Vector2D {
// Component length projected along x/y axis, respectively
final private int i, j;
public Integer(int i, int j) {
this.i = i;
this.j = j;
}
public Object doStuff() { /* vector operations */ }
}
public final static class Float extends Vector2D {
// Identical to Vector2D.Integer, except with floats
}
public final static class Double extends Vector2D { /* Same Idea */ }
// Outer class methods and whatnot
}
Очевидно, Vector2D.Integer
, Vector2D.Float
и Vector2D.Double
все окончательные. Есть ли способ сделать Vector2D
окончательным для всех, кроме этих внутренних классов?
Кстати, вы не можете использовать дженерики для этого? Большинство операций должны работать с ними, и более идиоматично писать Vector в Java вместо Vector.Integer ... Тогда вам не понадобится все, что кастинг вокруг ... –
Falco
@Falco В зависимости от требований к производительности преобразования бокса/распаковки могут (к сожалению, все еще) быть чрезмерно дорогими (последнее, но не менее важное из-за потенциального мусора, подразумеваемого миллионами экземпляров «Double»). Существует причина для специализации, например, «Поток» в Java 8 как «DoubleStream» ...) – Marco13