В Java: Как получить доступ к статическому свойству динамически ссылающегося класса? - PullRequest
0 голосов
/ 07 февраля 2011

В Java: как получить доступ к статическому свойству динамически ссылающегося класса?Я привожу короткий пример:

AppleTree.areTheyAllGrown=true;

Я просто хочу динамически ссылаться на класс статического свойства 'areTheyAllGrown'. Это статическое свойство может быть членом AppleTree или может быть членом какого-то другого класса, которыйКонечно же, статическое свойство будет иметь то же имя: areTheyAllGrown.

Поскольку логика моего приложения требует, чтобы у меня было много других типов дерева, таких как CherryTree, ApricotTree и т. д., это означает, что интерфейс TreeBehaviour не будетбудет достаточным решением, потому что, задав 'areTheyAllGrown' специально для AppleTree, я хочу отметить, скажем: только мои экземпляры AppleTree для этого, а не все экземпляры Tree.Видите?

Вы бы сказали: создайте интерфейс AppleTreeImpl и поместите туда свойство ... ну ... это заставит адский интерфейс создавать только одно свойство ... Impl Интерфейс для всех моихразные типы деревьев?Разве нет более короткого решения?

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

Ответы [ 3 ]

6 голосов
/ 07 февраля 2011

Я бы посоветовал оставить это вне классов. В другом классе GrowingRegistry, где вы можете иметь карту - Map<Class, Boolean>. И так вы можете сделать:

GrowingRegistry.setAllGrown(AppleTree.class, true);

Еще лучше, вы можете реализовать интерфейс Tree, который, например, определяет getTreeType(), и иметь карту Map<TreeType, Boolean>, где TreeType - это перечисление. Итак:

GrowingRegistry.setAllGrown(TreeType.APPLE, true);

Чтобы продолжить, у вас может быть GardenProperties объект, который содержит все свойства для "сада".

И, как я уже упоминал, сад - все проблемы возникают из-за того, что вы хотите отслеживать все экземпляры объектов. И это вы их создаете, не так ли? Таким образом, вы можете поместить все экземпляры в свои коллекции. Например:

Garden garden = new Garden();
garden.add(new AppleTreeImpl());
garden.add(new CherryTreeImpl());

Там вы можете хранить экземпляры в List или Map, а также использовать сад для хранения всех свойств.

0 голосов
/ 30 августа 2017

Если у вас есть объект, вы можете просто сделать то, что предлагаете непосредственно для объекта.

Если у вас есть класс, вы могли бы использовать отражение:

try {
    treeClass.getField("areTheyAllGrown").set(treeClass, true);
} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) {
    // Do whatever you want with the error
    // e.g.: e.printStackTrace();
    // Or you could add a throws declaration
};
0 голосов
/ 08 февраля 2011

Ну, отражение - единственный способ сделать то, что он описал.Делать что-то еще, безусловно, лучшая идея.Я бы предложил карту, логическое> (которая на самом деле является сетом).

- от maaartinus 19 минут назад

...