значения параметров по умолчанию в аргументах и ​​наследовании

У меня проблемы с некоторыми Java. Как указать значения параметров по умолчанию в Java? например, у меня есть это в С++

DVD(int i, string t, int y, string d="Unknown"): Items(i,t,y),director(d){} и в Java пробовал

public Dvd(int i, String t,int y, String d="Unknown"){
        super(i,t,y);
        director = d;
    }

что не получается построить. Итак, как мне указать значения по умолчанию?

Также в моем основном классе тестирования я попытался указать 3 аргумента вместо 4, но это также не помогло. Как мне обойти эту проблему?


person silent    schedule 27.05.2010    source источник


Ответы (4)


К сожалению, Java не поддерживает такую ​​конструкцию аргумента по умолчанию. Традиционный способ реализовать это, к лучшему или к худшему, заключается в использовании так называемых методов «телескопирования».

Вот цитата из Effective Java 2nd Edition, Item 2: Рассмотрите шаблон конструктора при наличии множества параметров конструктора:

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

Шаблон телескопического конструктора, по сути, выглядит примерно так:

public class Telescope {
    final String name;
    final int levels;
    final boolean isAdjustable;

    public Telescope(String name) {
        this(name, 5);
    }
    public Telescope(String name, int levels) {
        this(name, levels, false);
    }
    public Telescope(String name, int levels, boolean isAdjustable) {       
        this.name = name;
        this.levels = levels;
        this.isAdjustable = isAdjustable;
    }
}

И теперь вы можете сделать любое из следующего:

new Telescope("X/1999");
new Telescope("X/1999", 13);
new Telescope("X/1999", 13, true);

Однако в настоящее время вы не можете установить только name и isAdjustable и оставить levels по умолчанию. Вы можете предоставить больше перегрузок конструктора, но, очевидно, их число резко возрастет по мере роста количества параметров, и у вас может быть даже несколько аргументов boolean и int, что действительно приведет к беспорядку.

Как вы можете видеть, это не очень приятный шаблон для написания и еще менее приятный для использования (Что здесь означает «истина»? Сколько будет 13?).

Блох рекомендует использовать шаблон построителя, который позволит вам вместо этого написать что-то вроде этого:

Telescope telly = new Telescope.Builder("X/1999").setAdjustable(true).build();

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

Таким образом, в Java нет механизма аргументов по умолчанию, но шаблон построителя в любом случае является гораздо лучшей идиомой.

Смотрите также

Похожие вопросы

person polygenelubricants    schedule 27.05.2010

Java не имеет возможности указывать значения параметров по умолчанию, однако вы можете добиться того же эффекта, выполнив что-то вроде этого (где вы хотите, чтобы a2 имел значение по умолчанию true в этом случае)

public void aMethod(boolean a1)
{
    aMethod(a1, true);
}

public void aMethod(boolean a1, boolean a2)
{
    // your code here
}

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

person Rich Adams    schedule 27.05.2010

Может быть, вы можете перегрузить конструктор и попробовать еще раз

public Dvd(int i, String t,int y, String d ){
        super(i,t,y);
        director = d;
    }


public Dvd(int i, String t,int y){
        super(i,t,y);
        director = "Unknown";
    }
person Kunal    schedule 27.05.2010