Подтвердить что ты не робот

Почему присвоение 'this' запрещено в java?

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

В С++ можно назначить *this.

Вопрос заключается не в том, как обойти назначение до this. Это очень просто, но скорее, какое обоснование стоит за решением не превращать переменную this.

Являются ли причины техническими или концептуальными?

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

РЕДАКТИРОВАТЬ Пожалуйста, отмените варианты "потому что спецификации Java говорят так". Я хотел бы узнать причину решения

4b9b3361

Ответ 1

В С++ можно назначить *this

Да, но вы не можете сделать this = something в С++, который, на мой взгляд, больше подходит для того, что вы спрашиваете на стороне Java здесь.

[...] какое обоснование существует за решением не делать this переменную.

Я бы сказал, ясность/удобочитаемость.

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

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

Являются ли причины техническими или концептуальными?

В основном концептуально я предполагаю. Тем не менее, возникнет несколько технических причуд. Если вы можете переназначить значение this, вы можете полностью скрыть переменные экземпляра за локальными переменными, например.

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

Я не уверен, что полностью понимаю это утверждение, но да, склонность к ошибкам, вероятно, является основной причиной решения сделать это ключевым словом, а не переменной.

Ответ 2

Являются ли причины техническими или концептуальными?

ИМО, концептуальный.

Ключевое слово this - это короткая рука для "ссылки на объект, метод которого вы сейчас выполняете". Вы не можете изменить, что это за объект. Это просто не имеет смысла в модели исполнения Java.

Так как нет смысла изменять this, нет смысла делать его переменной.

(Обратите внимание, что в С++ вы назначаете *this, а не this. И в Java нет оператора * и нет реального эквивалента ему.)


Если вы заметите, что вы можете изменить целевой объект для метода в середине полета, то вот несколько встречных вопросов.

  • Какая польза от этого? Какие проблемы может решить эта (гипотетическая) лингвистическая функция... которая не может быть решена более легко понятным способом?

  • Как вы относитесь к мьютексам? Например, что произойдет, если вы назначаете this в середине синхронизированного метода... и имеет смысл предлагаемая семантика? (Проблема в том, что вы либо завершаете синхронизированный метод на объекте, у которого у вас нет блокировки... или вам нужно разблокировать старый this и заблокировать новый this с осложнениями, которые В дополнение к этому, как это имеет смысл с точки зрения того, какие мьютексы предназначены для достижения?)

  • Как бы вы поняли что-то вроде этого:

    class Animal {
        foo(Animal other) {
           this = other;
           // At this point we could be executing the overridden
           // Animal version of the foo method ... on a Llama.  
        }
    }
    
    class Llama {
        foo(Animal other) {
        }
    }
    

    Конечно, вы можете приписать семантику этому, но:

    • вы нарушили инкапсуляцию подкласса таким образом, который трудно понять, и
    • вы на самом деле ничего особого не сделали.

Если вы попытаетесь серьезно ответить на эти вопросы, я надеюсь, вы придете к выводу, что было бы плохой идеей реализовать это. (Но если у вас есть удовлетворительные ответы, я бы рекомендовал вам написать их и опубликовать их как ваш собственный ответ на ваш вопрос!)

Но на самом деле я сомневаюсь, что разработчики Java даже дали эту идею более чем на мгновение. (И правильно, IMO)


Наконец, форма *this = ... С++ - это всего лишь сокращение последовательности назначений атрибутов текущего объекта. Мы уже можем сделать это в Java... с последовательностью нормальных назначений. Конечно, нет необходимости в синтаксисе для поддержки этого. (Как часто класс повторно инициализирует себя из состояния другого класса?)

Ответ 3

, потому что this - final,

this - это ключевое слово, а не переменная. и вы не можете назначить что-то ключевому слову. теперь в течение минуты рассмотрим , если это ссылочная переменная в спецификации дизайна.. и см. пример ниже

и он содержит неявную ссылку на метод вызова объекта. и он используется только для справочной цели, теперь вы считаете, что присваиваете что-то this, так что не сломает ли он все?

Пример

рассмотрим следующий код из класса String (Примечание: ниже код содержит ошибку компиляции, это просто демонстрация OP ситуации)

   public CharSequence subSequence(int beginIndex, int endIndex) {
      //if you assign something here
       this = "XYZ"  ;
       // you can imagine the zoombie situation here
      return this.substring(beginIndex, endIndex);
   }

Ответ 4

this не является даже переменной. Это ключевое слово, как определено в Спецификация языка Java:

При использовании в качестве основного выражения ключевое слово this обозначает значение, которое является ссылкой на объект, для которого был вызван метод экземпляра (§15.12), или для объекта, который был создан

Таким образом, это невозможно, так как невозможно присвоить значение while.

Ответ 5

this в Java является частью языка, ключевого слова, а не простой переменной. Он был создан для доступа к объекту из одного из его методов, а не для другого объекта. Присвоение другому объекту может вызвать беспорядок. Если вы хотите сохранить ссылку на другие объекты в своем объекте, просто создайте новую переменную.

Причина просто концептуальна. this был создан для доступа к самому объекту, например, чтобы вернуть его в методе. Как я уже сказал, это вызовет беспорядок, если вы присвоите ему еще одну ссылку. Скажите мне, почему изменение this имеет смысл.

Ответ 6

Назначение *this в С++ не эквивалентно назначению this в Java. Назначение this есть, и оно не является законным ни на одном из языков.