2013-07-18 2 views
3

У меня есть абстрактный класс с абстрактным методом, параметры которого я хочу быть final - то есть я не хочу разрешать реализацию абстрактного класса & метод переназначения параметра ,Создание абстрактных параметров метода final в Java

EDIT: Мотивация для этого не является неизменной как таковой, которая больше связана с дизайном объектов. (На самом деле, в моем случае использования, этот параметр представляет собой набор, который будет мутирован при реализации абстрактного метода.) Скорее, я хочу сообщить кому-либо, кто реализует мой абстрактный класс/метод, чтобы эти переменные не переназначались. Я знаю, что могу сообщить об этом через java-doc, но я искал что-то более договорное, - что им следовало бы следовать, а не просто руководствоваться.

В неабстрактном методе, я могу сделать это, используя final ключевое слово - например:

public class MyClazz { 
    public void doSomething(final int finalParameter){ 
    finalParameter++; // compile error - cannot assign a value to final variable 
    } 
} 

Однако, если я использую final ключевое слово в абстрактном методе, это не является частью из контракт - то есть, реализации абстрактного метода не требуется final ключевое слово, а параметр может быть переназначен:

public abstract class MyAbstractClazz { 
    public abstract void doSomething(final int finalVariable); 
} 

public class MyExtendedClazz extends MyAbstractClazz { 
    @Override 
    public void doSomething(int finalVariable) { // does not require final keyword 
    finalVariable++; // so the variable is modifiable 
    } 
} 

Как указано в ответах на этот SO Question, тоКлючевое словоне является частью сигнатуры метода, поэтому реализация абстрактного класса не требует его.

Итак, есть два вопроса:

  1. Почему является final ключевое слово не является частью сигнатуры метода? Я понимаю, что это не так, , но я хочу знать, есть ли какая-то особая причина, почему это не так.

  2. Учитывая, что ключевое слово final не является частью сигнатуры метода, существует ли альтернативный способ сделать параметры абстрактным методом нецелесообразными?

Другие исследования:

  • это SO question штрихи по одному вопросу, но не одно из двух моих вопросов. На самом деле, второй вопрос задан явно, но не получает ответа.

  • множество вопросов/блогов и т. Д. По последнему ключевому слову см. В "the final word". Тем не менее, по отношению к этому вопросу, соответствующий комментарий следующим образом (что, в то время как полезные, не решают мои два вопроса):

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

+0

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

+0

Что именно вы пытаетесь достичь? Неизменность? –

+0

@ ErikPragt - исправленный вопрос о мотивации. – amaidment

ответ

9

У меня есть абстрактный класс с абстрактным методом, параметры, для которых я хочу быть окончательным - то есть, я не хочу, чтобы позволить реализации абстрактного метода класса & переназначать параметр.

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

Метод должен реализовать документированный контракт, но как он это делает, зависит от него. Контракт не может сказать ничего полезного о конечности параметра, так как Java всегда использует pass-by-value.

+0

Хорошо, спасибо - это понятно, почему он не является частью подписи. Я изменил свой вопрос с большей мотивацией, но я ожидаю, что лучшее, что я могу сделать, это указать предполагаемую реализацию документации. – amaidment

+0

@amaidment: Я думаю, что вам не хватает смысла - почему кому-то будет интересно, изменила ли реализация метода значение параметра? Это * полностью скрыто от внешнего мира. Вы говорите, что «эти переменные не следует переназначать» - почему вас волнует, как этот метод реализуется? Если одна реализация оказывается более чистой, если она переназначает параметр, почему вы хотите предотвратить это? –

+0

Это хорошие, полезные вопросы ... ответ на все, что я понимаю, это «Я не должен». – amaidment

1

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

Смежные вопросы