Получение объекта по его адресу - PullRequest
0 голосов
/ 09 мая 2018

Это просто для общего знания, и я почти уверен, что это невозможно, но мне интересно знать.

Предположим, у меня есть объект класса Student s1, и я передаю его функции как myFunc(s1.toString()).Я не переопределил функцию toString().Когда параметр достигнет функции, могу ли я вернуться к исходному объекту только по его адресу?

код:

public static void main(){
    Student s1;
    myFunc(s1.toString());
}
public static myFunc(String address){
    Student s2;
    s2 = //get s1 object from address string
}

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

То, что вы просите сделать, невозможно по проекту , оставаясь на языке Java. В отличие от таких языков, как C, которые просто передают произвольный контроль над областью памяти программе, JVM использует модель ability , где как безопасность, так и некоторая степень корректности зависят от того, что ссылки могут ' поддельный (произведенный из пользовательских данных, таких как строка, а не сгенерированный самой ВМ) - единственный официальный способ получить ссылку на объект - создать этот объект с помощью new или скопировать существующую ссылку.

0 голосов
/ 09 мая 2018

Самый простой способ сделать это - зарегистрировать все экземпляры Student при их создании:

class Student {
  private static final Map<String, Student> registry = new HashMap<>();

  Student() {
    registry.put(this.toString(), this);
  }

  static Student fromString(String address) {
    return registry.get(address);
  }
}

Тогда вы можете получить экземпляр в вашем методе, используя Student.fromString(address).

Но есть много причин, чтобы этого не делать:

  • Это приводит к утечке памяти, потому что экземпляры Student никогда не могут быть GC'd, поскольку они доступны через реестр.
  • Небезопасно публикует экземпляр
  • Это означает, что вы не можете изменить значение toString() после конструктора, если вы хотите предоставить пользовательскую реализацию позже
  • Это изменчивое глобальное состояние, которое никогда не бывает хорошей идеей
  • Как следствие предыдущего пункта, трудно проверить
  • Хеш-коды не являются уникальными, поэтому несколько экземпляров Student могут иметь одну и ту же строку; в таком случае реализация здесь будет возвращать последний созданный экземпляр с заданной строкой.

как несколько, чтобы вы начали.

Короче, было бы нецелесообразно это делать.

Существуют альтернативные способы реализации реестра, позволяющие избежать некоторых или всех этих проблем, но это будет изобретением колеса.

Вам не нужно ссылаться на экземпляры по строке: ссылаться на них, используя ссылки.

0 голосов
/ 09 мая 2018

Хотя хеш-код по умолчанию в распространенных реализациях использует адрес объекта для его генерации, он необратим (и используемый адрес является подробностью реализации, а не определенной функциональностью).

Даже если бы это было возможно, адрес объекта может измениться во время выполнения (тогда как хеш-код по умолчанию этого не делает), так что это не будет жизнеспособным подходом, даже если бы был способ обратить его.

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