создать статический объект из класса, который действует как метод - PullRequest
0 голосов
/ 11 июня 2018

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

Я разработчик Android и начинаю быть легендой.: D

public final class ClassName{

    public static ClassName initSDK(@NonNull @GuiContext Context context) {
        return new ClassName(context);
    }   

    private ClassName(Context guiContext) {
        startSDK(guiContext);
    }

}

что такое initSDK.как называется и каков механизм?

Спасибо за ваше драгоценное время!

Ответы [ 4 ]

0 голосов
/ 11 июня 2018

initSDK - это фабричный метод для создания экземпляра ClassName , поскольку его конструктор имеет значение private и не может быть вызван извне.Поэтому нам нужен некоторый public, к которому можно получить доступ без создания нового экземпляра, поэтому доступен метод public static type.

Почему бы не сделать конструктор закрытым?Потому что фабрика по предоставлению предназначена для управления механизмом создания объектов.

0 голосов
/ 11 июня 2018

initSDK здесь static method, который вы называете через имя класса, например:

ClassName instance1 = ClassName.initSDK(context);

Внутренне он создает object instance из ClassName и возвращает его.Например, instance1 здесь является экземпляром ClassName.

Обратите внимание, что конструктор класса private ClassName(Context guiContext) { .. } объявлен private, что означает, что вы не можете создать экземпляр этого объекта с помощью метода ниже:

// Wrong, can't instantiate object this way. Constructor is declared "private"
ClassName instance2 = new ClassName(context);

Подобно initSDK, иногда этот аналогичный метод называется getInstance(), что указывает get me an instance of the object, доступ через имя пакета.

0 голосов
/ 11 июня 2018

Это шаблон создания, называемый Factory Pattern, он скрывает логику создания

Пример использования:

public interface MyFile {
    public String getContent(String filename);
}

public class MyCSVFile impelments MyFile {
    public String getContent(String filename) {
        // proper implementation on how to open and read CSV file
    }   
}

public class MyPDFFile impelments MyFile {
    public String getContent(String filename) {
        // proper implementation on how to open and read PDF file
    }   
}


public class MyFactory {

    public MyFile factory(String filename) {
        String ext = // utility to get file extension ...
        if (ext.equals("pdf")) {
            return new MyCSVFile(filename);
        }
        if (ext.equals("csv")) {
            return new MyPDFFile(filename);
        }

        // unhandled operation ? setup a default file reader ?
        // ...
    }
}

public class MyBusinessClass {

    public static void main(String[] args) {
        MyFile myFile = new MyFactory().factory(args[1]);
        System.out.println(myFile.getContent(args[1]));
    }
}
0 голосов
/ 11 июня 2018

Вы можете позвонить с ClassName.initSDK() из другого класса.Это статический метод.Обратитесь к документации .

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