Использование статических членов дочернего класса в родительском классе на основе аргументов - PullRequest
0 голосов
/ 24 сентября 2019

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

Для приведенного ниже кода мое требование заключается в том, чтобы, если я позвоню

Test.x, предоставив какой-то аргумент, скажем Test1 или Test2, он должен получить мнезначение из соответствующего класса.Может ли кто-нибудь помочь мне с этим ??

Я не хочу использовать Builder(), CSV или создавать экземпляр класса.Есть ли другое решение для этого?

Class Test() {
    static int x;
    static int y;
    static int z;
}

Class Test1() {
    static int x = 1;
    static int y = 2;
    static int z = 3;
}

Class Test2() {
    static int x = 4;
    static int y = 5;
    static int z = 6;
}

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

public class test{
  static int a;
  static int b;
  static int c;
  
  
  //to use the values of test1 class do this
  a = test1.a;
  b = test1.b;
  c = test1.c;
  
  
  //to use the values of test2 class do this
  a = test2.a;
  b = test2.b;
  c = test2.c;
}

public class test1{
  static int a = 1;
  static int b = 2;
  static int c = 3;
}

public class test2{
  static int a = 4;
  static int b = 5;
  static int c = 6;
}

надеюсь, это поможет

0 голосов
/ 24 сентября 2019

К сожалению, есть несколько проблем со статикой и наследованием.

Лучше всего сделать пользовательскую конфигурацию на основе классов декларативную в данных (свойства, XML), но это можно сделать в коде,Базовый класс может содержать карту конфигурации всех детей.

class Base {

    private static Map<Class<T extends Base>, Config> configByClass = new HashMap<>();

    protected Base(Supplier<Config> configProducer) {
        // Could do in constructor:
        configByClass.merge(getClass(), (oldk, k) -> {
            if (oldk == null) {
                return configProducer.get();
            }
        });
    }

    protected final Config getConfig() {
        // Could do lazy in getter
        configByClass.merge(getClass(), (oldk, k) -> {
            if (oldk == null) {
                return configProducer.get();
            }
        });
        return configByClass.get(getClass());
    }
}

class Child1 extends Base {
    public Child1() {
        super(() -> {
            Config config = new Config(1, 3, 4);
            ...
            return config;
        });
    }

    void f() {
    }
}

Вызов поставщика конфигурации внутри Конструктор имеет одну маленькую ловушку: поля дочернего класса по-прежнему недоступны, но вы сделалине хочу использовать отдельные объекты в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...