Как отметил farooq, местоположение файла для манифеста не имеет значения, если манифест отвечает всем требованиям для получения манифеста :
манифест задаются следующим алгоритмом. Алгоритм, в случае успеха, возвращает обработанный манифест и URL манифеста; в противном случае он завершается преждевременно и ничего не возвращает. В случае, если ничего не возвращается, пользовательский агент ДОЛЖЕН игнорировать декларацию манифеста. Выполняя эти шаги, пользовательский агент НЕ ДОЛЖЕН задерживать событие загрузки.
blockquote>
- Из Документа контекста просмотра верхнего уровня пусть origin будет источником документа, , а ссылка manifest будет первым элементом ссылки в древовидной структуре, атрибут rel которого содержит манифест токена. 112]
Таким образом, это нормально для манифеста Django Progressive Web App, и расположение файла должно основываться на соглашении проекта:
Сделайте так, чтобы конструкторы в Player
имели только доступ к пакету. Тогда они не смогут вызывать конструктор или расширять его сами. Если у вас еще нет явного конструктора в Player
, создайте его (иначе компилятор создаст открытый конструктор по умолчанию без параметров).
(Обратите внимание, что я предложил только сделать это конструктору . Сам класс может быть общедоступным, чтобы клиенты все еще могли его использовать.)
Это работает, потому что любой конструктор (кроме java.lang.Object
) должен вызывать конструктор суперкласса (явно или неявно). Если доступных конструкторов нет, вы не можете создать подкласс.
Убедитесь, что конструкторы Player не являются общедоступными:
public abstract class Player {
Player() {
// initialization goes here
}
}
Тогда классы могут расширять Player из одного пакета, но не должно быть в состоянии снаружи пакета.
Хм ... сделать класс Player закрытым? Просто оставьте «public», тогда он будет закрытым для пакета, то есть только классы в одном и том же пакете могут его расширить.
Однако ничто не мешает людям размещать свои собственные классы в этом пакете. Я полагаю, что это можно предотвратить, поместив его в JAR со знаком, тогда любая попытка загрузить неподписанный (или другой подписанный) класс в один и тот же пакет потерпит неудачу.
I'd recommend
The problem with this approach is that you end up with everything needing to be in a single package, which is bad for organization as the library grows.
To allow use of multiple packages with protection, take a look at OSGi.
OSGi allows you to restrict which packages a bundle (jar) allows other bundles to access, and even set up "friend" bundles that are allowed extra visibility.
Java's package-as-protection-unit model is not sufficient when you really want to protect libraries that get large...
Используйте модификатор доступа по умолчанию, также известный как «Закрытый пакет». Другими словами, не указывайте модификатор доступа
abstract class Player { /*...*/ }
Документация здесь на веб-сайте Sun описывает все модификаторы доступа более подробно.