Java: проблемы с пониманием, как вызвать экземпляр из другого класса - PullRequest
0 голосов
/ 15 декабря 2018

Я был взволнован, пытаясь понять, как вызвать метод из экземпляра класса из другого класса.Например:

public class Test1 
 {

    public static void makeSomeInst()
    {
        Test1 inst = new Test1();
        inst.fireTest();
    }

    public void fireTest()
    {
        System.out.println("fireTest");
    }

    public Test1()
    {

    }

}

нет проблем с пониманием вышеизложенного, но что если я захочу сделать что-то для inst из класса с именем Test2, как бы я это сделал?Приведенный ниже пример не работает:

public class Test2 
{
    public static void main(String[] args) 
    {
        Test1.makeSomeInst();
        inst.fireTest();
    }
}

И для большей ясности я понимаю, что могу вызывать статические ссылки без создания экземпляров, но я просто хочу знать, в этом конкретном случае

Каков синтаксис для ссылки на объект test1 с именем inst из класса Test2?

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

что если я захочу сделать что-то для inst из класса Test2, как бы я это сделал?

Прежде всего вы должны научить класс Test2 чему Test1 is.

public class Test2 
{
    public doSomething()
    {
        inst.fireTest();
    }

    public Test2(Test1 inst) 
    {
        this.inst = inst;
    }

    private Test1 inst;
}

Затем научите объект inst2, что такое inst.

public class Test1 
{

    public static void main(String[] args) 
    {
        Test1 inst = new Test1();

        Test2 inst2 = new Test2(inst); // <- new code

        inst2.doSomething();           // <- new code
    }

    public void fireTest()
    {
        System.out.println("fireTest");
    }

    public Test1()
    {

    }

}

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

То, на что вы смотрите, называется передачей ссылок.Причудливый термин для него - Инъекция чистой зависимости *.Основной шаблон заключается в построении графа объектов в main.После того, как это будет сделано, вызовите один метод для одного объекта, чтобы все началось.

В основном вы строите каждый объект, который будет жить так же долго, как ваша программа.Здесь вы не найдете построенных объектов, таких как метки времени.Хорошее практическое правило - создавать каждый из этих долгоживущих объектов, прежде чем выполнять какую-либо реальную работу.Поскольку они знают друг о друге, они могут передавать поток управления взад и вперед между ними.Там много энергии, и если ее не использовать должным образом, это может запутать.Посмотрите на Архитектурные паттерны , чтобы упростить эту простоту.

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

0 голосов
/ 15 декабря 2018

Вы должны сохранить свой экземпляр где-нибудь.Если Test1 должен быть одноэлементным, вы можете сделать:

public class Test1 
{
    private static Test1 instance;

    public static Test1 getInstance()
    {
        return instance == null ? instance = new Test1() : instance;
    }

    public static void main(String[] args) 
    {
        Test1 inst = getInstance();
        inst.fireTest();
    }

    public void fireTest()
    {
        System.out.println("fireTest");
    }
}

и в Test2:

public class Test2 
{
    public static void main(String[] args) 
    {
        Test1.getInstance().fireTest();
    }
}

// Редактировать

Как я только что узнал из @Thomas Sкомментарий, синглтоны не являются хорошим решением.См. Ответ @ candied_orange для лучшей реализации.

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