Java-эквивалент Smalltalk станет:

Есть ли способ поменять себя (это) каким-либо другим объектом в Java?

В Smalltalk мы могли бы написать

Object subclass:myClass [
    "in my method I swap myself with someone else"
    swapWith:anObject [
        self become:anObject.
        ^nil
    ]
]

myClass subclass:subClass [
]

obj := myClass new.
obj swapWith:subClass new.
obj inspect.

Результат An instance of subClass, очевидно.

Мне нужно сделать следующее в Java:

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

Итак, короче говоря, как я могу достичь в Java self become: (someClass new:someParameters)? Есть ли некоторые шаблоны проектирования, которые я мог бы использовать?

Ответ 1

В своей наиболее общей форме произвольная замена объекта невозможно согласовать со статическим набором. Эти два объекта могут иметь разные интерфейсы, поэтому это может поставить под угрозу безопасность типов. Если вы накладываете ограничения на то, как объекты могут быть заменены, такую ​​функцию можно сделать безопасной. Такая особенность никогда не становилась основной, но была исследована в исследованиях. Ищите вместо этого Gilgul.

Близко связана переклассификация, возможность динамического изменения класса объекта. Это возможно в Smalltalk с некоторыми примитивами. Опять же, это ставит безопасность типов на риски, никогда не становилось основной, но было исследовано в исследованиях. Посмотрите Широкие классы, Fickle или Plaid.

Решение о замене объектов с бедными людьми является прокси-сервером, который вы вставляете между клиентом и объектом для обмена, или использованием шаблонов проектирования состояния и стратегии.

Ответ 2

Здесь - интересная тема на официальном форуме. Я считаю, что объектная инкапсуляция в сочетании с сильными типами делает эту функцию неспособной работать на Java. Плюс для уже медленной JVM это может привести к катастрофе...

Ответ 3

this - зарезервированное слово в Java, и вы не можете его переопределить.

То, что вы пытаетесь сделать, может быть реализовано с простой ссылкой. Вы просто повторяете (или просматриваете график) и меняете указатель на то, что хотите быть активным.

Рассмотрим это:

 List<String> stringList = new ArrayList<String>();
 // fill your list

 String longestWord = "";
 for (String s : stringList) {
     if (longestWord.length() < s.length()) {
         longestWord = s;
     }
 }

longestWord теперь поигрывается с другим объектом.