Java .properties файлы как классы со строгим контролем типов

Я лично не согласился бы с Вашим преподавателем.

Вообще говоря, C++ основан на C, и в том "смысле" содержит его и расширяет его.

Однако с тех пор традиционно люди изученный C и только тогда расширения C++, оператор Вашего преподавателя является неправильным с тех пор использовать C++ правильно, необходимо было бы освоить источники C. Возможно, что при обучении Вам что-то, Ваш преподаватель или учебник конкретно не упомянут то, что прибыло из который язык.

, Кроме того, важно понять это несмотря на общие черты, не каждый прогоны программы C таким же образом под C++. Например, C структуры интерпретируются по-другому (как классы со всем общедоступным) компилятором C++.

, Когда я преподаю, я преподаю ядро C сначала, и затем перехожу к C++.

8
задан yusuf 17 October 2009 в 07:31
поделиться

7 ответов

Существует несколько похожий проект для настройки статически типизированных файлов. Требуется объявить интерфейс, но он заполняет саму реализацию:

public interface AppConfig extends Config {
    long getTimeout ();
    URL getURL ();
    Class getHandlerClass ();
}
2
ответ дан 5 December 2019 в 20:17
поделиться

Существует бесчисленное множество фреймворков, которые достигают этого для 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;
    }
   ...
 }
3
ответ дан 5 December 2019 в 20:17
поделиться

OP хотел бы сопоставить файл свойств с API Java, чтобы каждое указанное свойство в файле соответствовало одноименному методу получения в API. Я предполагаю, что приложение затем будет использовать этот API для получения значений свойств без использования строк с именами свойств.

Концептуальная проблема заключается в том, что файл свойств по сути не является статически типизированной сущностью. Каждый раз, когда кто-то редактирует файл свойств, он может добавлять новые свойства и, следовательно, изменять «тип» файла свойств ... и, косвенно, подпись соответствующего API. Если мы проверили отсутствие неожиданных свойств, когда приложение Java загрузило файл свойств, то мы получили явную динамическую проверку типов. Если мы не проверяем неожиданные (например, неправильно названные) свойства, у нас есть источник ошибок. Все становится еще хуже, если вы хотите, чтобы типы значений свойств были чем-то другим, кроме String.

Единственный способ сделать это должным образом - изобрести концепцию схемы для файла свойств, в которой указаны имена свойств и типы значений свойств. Затем реализуйте редактор файла свойств, который гарантирует, что пользователь не сможет добавлять свойства, конфликтующие со схемой.

И на этом этапе мы должны признать, что лучшим решением было бы использовать XML в качестве представления файла свойств, редактор, управляемый схемой XML. для редактирования файлов свойств, а также JAXP или что-то в этом роде для сопоставления файла свойств с API Java.

0
ответ дан 5 December 2019 в 20:17
поделиться

Если вы хотите сделать это статически, это проблема генерации кода, которая может быть решена довольно легко (для каждого элемента в файле создайте новый метод getXXX ).

Но если вы этого хотите, во время выполнения, тогда у вас есть проблема с тем, что ваш метод ссылки на код не существует во время компиляции; Я не думаю, что это можно сделать.

(Обратите внимание, что если вы ищете идею проекта, обратное, имеющее интерфейс с методом доступа и аннотацией, а также реализацию, созданную во время выполнения, которая полагается на аннотированные методы , можно сделать.)

0
ответ дан 5 December 2019 в 20:17
поделиться

Инструмент обработки аннотаций ( apt ) не может изменять классы (хотя он может создавать новые). Чтобы изменить класс во время компиляции, вам, вероятно, потребуется отредактировать AST (как это делает Project Lombok ). Самым простым подходом, вероятно, было бы сгенерировать классы, а затем использовать сгенерированную библиотеку как зависимость для другого кода.

1
ответ дан 5 December 2019 в 20:17
поделиться

Что-то вроде JFig (уродливый IMO), Commons Configuration или EasyConf ?

1
ответ дан 5 December 2019 в 20:17
поделиться

Еще один способ - использовать структуру привязки данных, которая делает это. Даже тот, который, кажется, не поддерживает напрямую, может работать: например, процессор JSON Jackson позволяет делать это с помощью чего-то вроде:

ObjectMapper m = new ObjectMapper (); MyBean bean = m.convertValue (свойства, MyBean.class); // (примечание: требуется последний код из магистрали; в противном случае сначала нужно написать, прочитать обратно)

, который работает, пока записи в карте свойств соответствуют свойствам логического компонента, а значения String могут быть преобразованы в соответствующие базовые значения.

1
ответ дан 5 December 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: