Может ли класс Java иметь представление о своем экземпляре? - PullRequest
3 голосов
/ 01 марта 2010

Есть ли способ для класса Java иметь представление о своем экземпляре?Например:

public class Foo() {

    public Foo() {
        // can I get Bar.myInteger from here somehow 
        // without passing it in to the constructor?
    }
}

public class Bar {
    private int myInteger;

    public Bar() {
        myInteger = 0;

        Foo foo = new Foo();
    }
}

Ответы [ 11 ]

8 голосов
/ 01 марта 2010

Есть ли какая-то особая причина, по которой вы не хотите передавать что-либо в конструктор?

Проще говоря, это нарушает принцип инкапсуляции ... и, возможно, некоторых других.

5 голосов
/ 01 марта 2010

С внутренними классами вы можете.

public class Bar {

   private int myInteger;

   public class Foo() {

        public Foo() {
             // you can access myInteger
        }
    }


    public Bar() {
        myInteger = 0;
        Foo foo = new Foo();
    }
}
2 голосов
/ 01 марта 2010

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

2 голосов
/ 01 марта 2010

Вы можете получить некоторую информацию с помощью трассировки стека:

Throwable t = new Throwable();
t.fillInStackTrace();
StackTraceElement[] stt = t.getStackTrace();

, затем исследуйте элементы stt[].

2 голосов
/ 01 марта 2010

Нет, вы не можете.

Что вы пытаетесь сделать?

0 голосов
/ 24 мая 2013

Сохраняя это простым ...
1. Если Foo всегда нужно знать myInteger из Bar, передайте его в конструктор.
2. Если Foo только иногда нужно знать myInteger, тогда вызывайте сеттер после конструктора.

Если Foo требуется больше, чем myInteger, то есть весь объект Bar, тогда Bar может передать себя с помощью ключевого слова this.

public class Foo
{
  public Foo(Bar bar)
  { 
    //Do something with Bar 
  }
}

// Где-то в Bar (нестатическим способом)
новый Foo (это);

0 голосов
/ 01 марта 2010

вы можете работать с внутренними классами, например так:

<code>
public class Bar {
    private int myInteger;
    public Bar() {
        myInteger = 0;
        Foo foo = new Foo();
    }
    class Foo {
        Foo() {
            int i = Bar.this.myInteger;
        }
    }
}

С уважением.

0 голосов
/ 01 марта 2010

Если бы Фу был внутренним классом для Бара, он мог видеть членов Бара.

0 голосов
/ 01 марта 2010

Вы можете заставить «Инстанциаторов» использовать Фабрику. Но в любом случае «идентичность» объекта, запрашивающего новый экземпляр, должна быть передана как параметр.

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

0 голосов
/ 01 марта 2010

Вы можете получить доступ к закрытому члену другого класса, только если явно передадите его конструктору, если предоставите функции получения / установки. Так что ответ на ваш вопрос - нет.

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