Java — способ предотвратить использование фреймворка коллекций для назначения?

#java #collections

#java #Коллекции

Вопрос:

Для конкретного назначения (на Java) мои ученики внедряют некоторые ADT, и я запрещаю им использовать любую из Java Collections Framework, которые мы рассмотрели ранее (List, Collections, LinkedList, Stack, Deque и т.д.).

Каковы некоторые хорошие способы принудительного применения / обнаружения этого ограничения, чтобы убедиться, что они не используют эти интерфейсы и классы для этого конкретного назначения?

Существует ли директива компилятора / переключатель / настройка для полного предотвращения использования java.util ? Я имею в виду, что это серьезная проблема, но для этого назначения пока это может обойтись просто java.lang . Я бы хотел использовать Iterator , и у них должны быть дженерики.

Я собирался попытаться обнаружить import операторы, но отражение не может получить их из байтового кода. В одном сообщении предлагалось использовать QDox в исходных файлах для получения импорта, но я не хотел загружать дополнительную библиотеку для этого. Должен ли я просто написать скрипт для сканирования их исходных файлов на предмет java.util.x импорта?

Я думал о том, чтобы просмотреть их файлы классов с отражением, чтобы узнать, есть ли какие-либо члены из этого списка типов… но довольно грязный :/

Большинство моих заданий проходят автоматическую оценку / модульное тестирование из-за количества студентов, хотя для некоторых заданий я просматриваю весь код, чтобы дать им дополнительную обратную связь. Итак, на данный момент я должен сделать это на этом, просто чтобы поймать тех, кто не следовал инструкциям.

Просто любопытно, что некоторые из вас сделали бы для этого.

Комментарии:

1. Насколько хитры ваши ученики? Вам вообще не нужен какой-либо импорт для использования любого класса, достаточно просто использовать полное имя класса.

2. это отличный момент, о котором я забыл, лол

3. Да, и я хорошо выполняю свою работу, оценивая тысячи своих очень успешных выпускников и очень высокие отзывы на нетривиальных курсах, количество времени, которое я провожу, работая с ними, и тот факт, что я помогаю своим студентам буквально между печатанием этого посреди ночи на сервере Discord. Но, как вы, возможно, знаете (или, по-видимому, нет), когда у вас есть сотни программ для оценки каждые несколько недель, мы (умные) учителя делаем небольшие вещи, чтобы автоматизировать определенные аспекты этой нагрузки, такие как запуск скриптов для проверки очевидного несоблюдения указаний и т.д. Увидел, что ты такой неуклюжий:(

Ответ №1:

Доступно множество анализаторов зависимостей, но если вы используете недавний JDK, jdeps (часть JDK начиная с 8) может быть достаточным для ваших нужд.

Например:

 $ jdeps -verbose:class -p java.util ~/opt/antlrworks/antlrworks-1.5.2-complete.jar
  

перечислены зависимости от java.util.* классов. Должно быть легко вызвать его из небольшого сценария оболочки или аналогичного для автоматической проверки.

Нет ничего невозможного в том, чтобы обойти обнаружение с помощью отражения ( Class.forName …), но если кто-либо из ваших учеников справится / знает, как это сделать, они в любом случае заслуживают бонусного балла. 😉

Дополнительная информация доступна здесь:https://wiki.openjdk.java.net/display/JDK8/Java Dependency Analysis Tool

Комментарии:

1. Это прекрасно, спасибо! Есть так много полезных инструментов, которые поставляются с JDK.

Ответ №2:

Одним из решений этого было бы использовать checkstyle и включить правило ‘IllegalImport’. https://checkstyle.sourceforge.io/config_imports.html#IllegalImport

Просто добавьте классы, которые вы хотите запретить, в список, и если они присутствуют в коде, сборка завершится неудачно.