Инициализируйте класс, имеющий другой объект класса в качестве переменной-члена - PullRequest
0 голосов
/ 20 июня 2019

Это мой первый класс:

package trickycorejava;

public class InnerClass {
    int id;
    oneClass oneClass;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public trickycorejava.oneClass getOneClass() {
        return oneClass;
    }

    public void setOneClass(trickycorejava.oneClass oneClass) {
        this.oneClass = oneClass;
    }

    public InnerClass(int id, trickycorejava.oneClass oneClass) {
        this.id = id;
        this.oneClass = oneClass;
    }
    public InnerClass(int id){
        this.id = id;
    }
}

class oneClass {
    private String name;

     public String getName() {
        return name;
     }

     public void setName(String name) {
        this.name = name;
    }
}

Это класс, в котором существует основной метод, обратите внимание, что пакет отличается:

package trickycorejava.constructor;

import trickycorejava.InnerClass;

public class InnerClassTest {
    public static void main(String[] args) {
        InnerClass innerClass = new InnerClass(1);
    }

}

Как я могу инициализировать InnerClassс конструктором в этом случае?Если я использую

InnerClass innerClass = new InnerClass(1, new oneClass("Test"));

, я получаю сообщение об ошибке, что oneClass не является общедоступным, не может быть доступа из внешнего пакета.

1 Ответ

2 голосов
/ 21 июня 2019

Как указывало в Turing85, oneClass должно быть в его собственном файле, иначе это будет package-private, что означает, что вы можете получить к нему доступ только из классов одного и того же пакета.

Есть ли другой способ?Есть, но это не будет простой вызов конструктора.Используя рефлексию, вы можете обойти защиту класса, поля и вызова метода.

public class InnerClassTest {
    public static void main(String[] args) throws Exception {
        Constructor<OneClass> constructor = OneClass.class.getDeclaredConstructor(String.class);
        constructor.setAccessible(true);
        OneClass instance = constructor.newInstance("John");
        InnerClass innerClass = new InnerClass(1, instance);
    }
}

Это значит, что он находит конструктор, который является приватным для Main, потому что класс является приватным для пакета.Затем он отключает его защиту, обратите внимание, что они временные, объект Constructor является новой ссылкой и разрешает вызов только по этой ссылке.

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

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