Я лично не согласился бы с Вашим преподавателем.
Вообще говоря, C++ основан на C, и в том "смысле" содержит его и расширяет его.
Однако с тех пор традиционно люди изученный C и только тогда расширения C++, оператор Вашего преподавателя является неправильным с тех пор использовать C++ правильно, необходимо было бы освоить источники C. Возможно, что при обучении Вам что-то, Ваш преподаватель или учебник конкретно не упомянут то, что прибыло из который язык.
, Кроме того, важно понять это несмотря на общие черты, не каждый прогоны программы C таким же образом под C++. Например, C структуры интерпретируются по-другому (как классы со всем общедоступным) компилятором C++.
, Когда я преподаю, я преподаю ядро C сначала, и затем перехожу к C++.
Существует несколько похожий проект для настройки статически типизированных файлов. Требуется объявить интерфейс, но он заполняет саму реализацию:
public interface AppConfig extends Config {
long getTimeout ();
URL getURL ();
Class getHandlerClass ();
}
Существует бесчисленное множество фреймворков, которые достигают этого для XML с различной степенью необходимой конфигурации. Стандартный, поставляемый с Java, - это JaxB, но это не совсем однострочный XML-фреймворк ...
Проблема в том, что использование файла свойств будет работать лучше, чем XML (или JSON, ...) на самых тривиальных классы. Когда класс станет немного сложнее, файл свойств превратится в кошмар. Другая проблема заключается в том, что с тривиальными классами нет большой разницы между Xml и свойствами.
Это означает, что объем проекта будет довольно ограничен. В основном полезно для проектов, содержащих множество простых файлов свойств.
В большом приложении, с которым я работал, чтение файлов свойств в строгом соответствии с типом выполняется довольно часто с использованием простого фабричного метода.
Foo foo = Foo.loadFrom("foo.properties");
class Foo {
static Foo loadFrom(String fileName) {
Properties props = new Properties();
props.load(...);
Foo foo = new Foo();
foo.setKeyFoo(props.get("KeyFoo"));
...
return foo;
}
...
}
OP хотел бы сопоставить файл свойств с API Java, чтобы каждое указанное свойство в файле соответствовало одноименному методу получения в API. Я предполагаю, что приложение затем будет использовать этот API для получения значений свойств без использования строк с именами свойств.
Концептуальная проблема заключается в том, что файл свойств по сути не является статически типизированной сущностью. Каждый раз, когда кто-то редактирует файл свойств, он может добавлять новые свойства и, следовательно, изменять «тип» файла свойств ... и, косвенно, подпись соответствующего API. Если мы проверили отсутствие неожиданных свойств, когда приложение Java загрузило файл свойств, то мы получили явную динамическую проверку типов. Если мы не проверяем неожиданные (например, неправильно названные) свойства, у нас есть источник ошибок. Все становится еще хуже, если вы хотите, чтобы типы значений свойств были чем-то другим, кроме String.
Единственный способ сделать это должным образом - изобрести концепцию схемы для файла свойств, в которой указаны имена свойств и типы значений свойств. Затем реализуйте редактор файла свойств, который гарантирует, что пользователь не сможет добавлять свойства, конфликтующие со схемой.
И на этом этапе мы должны признать, что лучшим решением было бы использовать XML в качестве представления файла свойств, редактор, управляемый схемой XML. для редактирования файлов свойств, а также JAXP или что-то в этом роде для сопоставления файла свойств с API Java.
Если вы хотите сделать это статически, это проблема генерации кода, которая может быть решена довольно легко (для каждого элемента в файле создайте новый метод getXXX
).
Но если вы этого хотите, во время выполнения, тогда у вас есть проблема с тем, что ваш метод ссылки на код не существует во время компиляции; Я не думаю, что это можно сделать.
(Обратите внимание, что если вы ищете идею проекта, обратное, имеющее интерфейс с методом доступа и аннотацией, а также реализацию, созданную во время выполнения, которая полагается на аннотированные методы , можно сделать.)
Инструмент обработки аннотаций ( apt ) не может изменять классы (хотя он может создавать новые). Чтобы изменить класс во время компиляции, вам, вероятно, потребуется отредактировать AST (как это делает Project Lombok ). Самым простым подходом, вероятно, было бы сгенерировать классы, а затем использовать сгенерированную библиотеку как зависимость для другого кода.
Что-то вроде JFig (уродливый IMO), Commons Configuration или EasyConf ?
Еще один способ - использовать структуру привязки данных, которая делает это. Даже тот, который, кажется, не поддерживает напрямую, может работать: например, процессор JSON Jackson позволяет делать это с помощью чего-то вроде:
ObjectMapper m = new ObjectMapper (); MyBean bean = m.convertValue (свойства, MyBean.class); // (примечание: требуется последний код из магистрали; в противном случае сначала нужно написать, прочитать обратно)
, который работает, пока записи в карте свойств соответствуют свойствам логического компонента, а значения String могут быть преобразованы в соответствующие базовые значения.