Как изменить объект из двух классов в Java? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть два класса и один другой объект. Мне нужно получить один и тот же объект (один и тот же экземпляр) в этих классах и возможность изменять его из этих классов. В первом классе мне нужен только метод получения этого объекта, во втором классе мне нужен setter. Оба класса находятся в еще одном классе (назовем ее третьим) на основе композиции. Я думаю о передаче ссылки из третьего класса в первый и второй, но во время этого она будет нулевой. Если я установлю его на какое-то значение из класса second, ссылка в классе first все равно будет ссылкой на null? Есть ли лучший и правильный способ сделать это?

class First {
      SomeClass object;

     public void setObject(SomeClass object) {
         this.object = object;
      }
      public SomeClass getObject() {
         return object;
      }
    }

    class Second {
      SomeClass object;

      public void setObject(SomeClass object) {
         this.object = object;
      }
    public SomeClass getObject() {
         return object;
      }
    }

    class Third {
      First first;
      Second second;
      SomeClass object;

      public void initializeClasses(){
        first.setObject(object);
        second.setObject(object);
      }
    }

Но в моменте initializeClassed ссылка пуста. Так что, если я после этого установлю во Второй класс, это будет тот же объект в Первом классе?

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Вы можете сделать просто как статический объект в третьем классе. Надеюсь, это поможет вам.

class First
          {
            SomeClass object;

            public void setObject(SomeClass object)
            {
                this.object = object;
            }

            public SomeClass getObject()
            {
                return Third.second.getObject();
            }
        }

  class Second
        {
            SomeClass object;

            public void setObject(SomeClass object)
            {
                this.object = object;
            }

            public SomeClass getObject()
            {
                return object;
            }
        }

  public class Third
        {
            static First first;
            static Second second;
            SomeClass object;

            public void initializeClasses()
            {
                first = new First();
                second = new Second();
                object = new SomeClass();
                System.out.println(object);
                second.setObject(object);
                System.out.println(first.getObject());

            }

            public static void main(String [] args)
            {
                Third t = new Third();
                t.initializeClasses();
            }
        }
0 голосов
/ 28 августа 2018

в вашем коде - Class First и Class Second оба имеют ссылочную переменную для SomeClass и оба имеют нулевое значение и не связаны. - если вы установите для объекта SomeClass новое значение во втором классе, значение первого класса все равно будет ссылаться на ноль.

Решение - передать инициализированный объект, чтобы ссылка SomeClass в классе First и классе Second указывала на один и тот же объект в памяти (не ноль) - никогда не устанавливайте ссылку SomeClass на новый объект во втором классе, это сделает ссылку SomeClass для указания на отдельные объекты в классе First и Class Second - вместо этого измените свойства объекта SomeClass, на который ссылается ссылка SomeClass во втором классе, чтобы увидеть, как эти изменения отражаются в первом классе

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

0 голосов
/ 28 августа 2018

Для Java 8 или новее вы можете отложить фактический доступ к SomeClass, используя Supplier<SomeClass>, а не ссылку. Вы бы сделали это так:

class A {
    private Supplier<SomeClass> objectSupplier;
    public SomeClass getObject() {
        return objectSupplier.get();
    }
    public void setObjectSupplier(Supplier<SomeClass> supplier) {
        objectSupplier = supplier;
    }
}

и создайте его так:

class C {
    class A a;
    private SomeClass object;

    public void initClasses() {
        a.setObjectSupplier(() -> object);
    }
}

Таким образом, экземпляр C a всегда будет возвращать C object, даже если он за это время изменится на C.

...