#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
Просто добавьте классы, которые вы хотите запретить, в список, и если они присутствуют в коде, сборка завершится неудачно.