проблема создания экземпляра перегруженного конструктора-одиночки -Error: конструктор типа не может быть применен к данным типам - PullRequest
0 голосов
/ 02 июля 2019

Я использую класс GoPiGo3 из GautamV / J4GPG на github для управления платой GoPiGo3 из DexterIndustries. Код не является официальным от DexterIndustries, но является портом Java из библиотеки Python, которую создает DexterIndustries.

Я просто пытаюсь протестировать код и не могу создать экземпляр класса GoPiGo3. Я использую BlueJ, создал пакет кода GautamV в BlueJ и импортировал класс GoPiGo3 в демонстрационный класс.

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

Вот соответствующий код из класса GoPiGo:


    private static GoPiGo3 _instance; 

    public static GoPiGo3 Instance() throws IOException, FirmwareVersionException{
        if (_instance == null) {
            _instance = new GoPiGo3(8, true);
        }
        return _instance;
    }

    public static GoPiGo3 Instance(int addr) throws IOException, FirmwareVersionException{
        if (_instance == null) {
            _instance = new GoPiGo3(addr, true);
        }
            return _instance;
    }

    public static GoPiGo3 Instance(boolean detect) throws IOException, FirmwareVersionException{
        if (_instance == null) {
            _instance = new GoPiGo3(8, detect);
        }
        return _instance;
    }

    public static GoPiGo3 Instance(int addr, boolean detect) throws IOException, FirmwareVersionException{
        if (_instance == null) {
            _instance = new GoPiGo3(addr, detect);
        }
        return _instance;
    }

    private GoPiGo3(int addr, boolean detect) throws IOException, FirmwareVersionException {
        SPIAddress = addr;
        spi = SpiFactory.getInstance(SpiChannel.CS1, // Channel 1
                500000, // 500 kHz
                SpiMode.MODE_0); // Mode 0
        if (detect) {
            //does detect stuff
        }

Ожидаемый результат - инициализированный объект класса GoPiGo3. Код в настоящее время не компилируется. Класс GoPiGo компилируется без ошибок, а демонстрационный класс, который пытается инициализировать класс GoPiGo, - нет.

Мои попытки создания экземпляров

GoPiGo3 platform = new GoPiGo3();

Это приводит к следующей ошибке:

Конструктор GoPiGo3 в классе com.j4gpg3.control.GoPiGo3 нельзя применять к данным типам: требуется: int.boolean
найдено: без аргументов
причина: фактические и формальные списки аргументов различаются по длине Оператор, который вы здесь используете, не может использоваться для типа значения, для которого вы его используете. Вы используете здесь неправильный тип или неверный оператор.

Когда я пытаюсь:

GoPiGo3 platform = new GoPiGo3(8,true);

Это приводит к следующей ошибке:

GoPiGo3 (int, boolean) имеет частный доступ в com.j4gpg3.control.GoPiGo3

1 Ответ

0 голосов
/ 02 июля 2019

Как вы сказали, он реализован с использованием одноэлементного шаблона, поэтому вам нужно использовать методы Instance вместо конструктора. Из-за частного модификатора в конструкторе private GoPiGo3(int addr, boolean detect)..., его можно вызвать только из класса GoPiGo3.

public static GoPiGo3 Instance() throws IOException, FirmwareVersionException{
    if (_instance == null) {
        _instance = new GoPiGo3(8, true);
    }
    return _instance;
}

public static GoPiGo3 Instance(int addr) throws IOException, FirmwareVersionException{
    if (_instance == null) {
        _instance = new GoPiGo3(addr, true);
    }
        return _instance;
}

public static GoPiGo3 Instance(boolean detect) throws IOException, FirmwareVersionException{
    if (_instance == null) {
        _instance = new GoPiGo3(8, detect);
    }
    return _instance;
}

public static GoPiGo3 Instance(int addr, boolean detect) throws IOException, FirmwareVersionException{
    if (_instance == null) {
        _instance = new GoPiGo3(addr, detect);
    }
    return _instance;
}

Чтобы получить экземпляр GoPiGo3, вам нужно сделать:

GoPiGo3 platform = GoPiGo3.Instance(8,true);

Справка:

https://www.geeksforgeeks.org/singleton-class-java/

...