Возможно, дело в том, что во втором случае instance создаётся не при вызове метода getInstance(), а при загрузке класса в виртуальную машину. То есть, если вы каким-то образом обратитесь к этому классу не для того, чтобы получить instance, то он всё равно будет создан.
Так как volatile write и volatile read находятся в отношении happens-before, поток, читающий значение, увидит все действия, которые делал поток, вызвавший rebuild(), до volatile write. То есть внутри одного потока все операции находятся в отношении happens-before, а так как это отношение транзитивно, то другие потоки увидят уже правильное значение переменной.
Мне кажется, что метод toArray() должен быть реализован в обоих типах матриц. Если есть интерфейс Matrix, то в нём должен быть метод toArray(). Уже в конкретной реализации разреженной матрицы можно добавить метод, предствляющий матрицу в более компактном виде.
Специфичность разреженной матрицы должна быть на уровне реализации, например использование более оптимальных алгоритмов при перемножении и т.п. Это как LinkedList и ArrayList. Методы-то в них одинаковые, пользователь сам решает для чего он будет использовать список и выбирает реализацию. Кажется, что в вашем случае должно быть так же.
Если A extends B, это не значит, что Set extends SetМожно просто написать
Set<java.util.Map.Entry<String, T>> x = new HashSet<java.util.Map.Entry<String, T>>();
и класть туда свою реализацию.
Ответ написан
Комментировать
Комментировать
Оценили как «Нравится»
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.