Почему inheritedDoc не определен в конструкторах?

Мне было интересно, существует ли какая-то действительная причина, почему javadoc не поддерживает inheritedDoc на constructors. Предположим, что

class A
{
/**
 * Constructor of A
 */
A(){}   

/**
 * Does something
 */
public void method(){}
}

class B extends A
{
/**
 * {@inheritDoc}
 */
B(){ super();}

/**
 * {@inheritDoc}
 */
public void method(){}
}

Для метода method я мог наследовать javadoc, но почему то же самое нельзя применить для constructors? Javadoc не наследуется, если я не использую тег inheritDoc, что означает, что я хорошо знаю, что хочу повторно использовать документацию. Что должно помешать мне сделать это для constructors?

Ответы

Ответ 1

Что должно помешать мне сделать это для конструкторов?

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

Я вижу практическое значение, но в равной степени я могу понять, почему что-то, что на самом деле не унаследовано, не должно иметь @inheritDoc. Было бы неплохо, если бы вы могли наследовать биты документации, например, если вы собираетесь передать значение параметра непосредственно конструктору суперкласса, было бы неплохо иметь возможность эффективно связываться с этой документацией...

Ответ 2

Мне нравится использовать следующие обозначения для решения этой проблемы:

public class TestReflectionHelper extends TestReflectionHelperCommon {

    /**
     * @see TestReflectionHelperCommon#TestReflectionHelperCommon()
     */
    public TestReflectionHelper() {
        super();
    }

    /**
     * @see TestReflectionHelperCommon#TestReflectionHelperCommon(Class, String,
     *      Class...)
     */
    public TestReflectionHelper(final Class<?> targetClass,
            final String targetMethod, final Class<?>... parameterTypes) {
        super(targetClass, targetMethod, parameterTypes);
    }

    ...
}

Ответ 3

Ну, это не очень хорошая причина, но это мое понимание:

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

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

О, кстати, там запрос функции от 2003 года на этом;)

Ответ 4

Это просто ограничение JavaDoc. Как Микель отметил, есть запрос функции для него, но через 10 лет никто не потрудился его реализовать. Чистая ленивость, говорю я.

Поскольку конструкторы не наследуются в Java, вы принудительно дублируете конструктор в подклассе. Это уже достаточно дублирование, но теперь из-за JavaDoc вы также вынуждены дублировать документацию.

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