проблема с созданием экземпляра одноэлементного перегруженного конструктора - Ошибка: конструктор в типе не может быть применен к заданным типам

Я использую класс 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 компилируется без ошибок, а класс Demo, который пытается инициализировать класс 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


person zach    schedule 02.07.2019    source источник


Ответы (1)


Как вы сказали, он реализован с использованием одноэлементного шаблона, поэтому вам нужно использовать методы 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/

person admlz635    schedule 02.07.2019