значения параметров по умолчанию в аргументах и ​​наследовании - PullRequest
0 голосов
/ 27 мая 2010

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

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 27 мая 2010

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?).

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

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

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

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

Смотри также

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

3 голосов
/ 27 мая 2010

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

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

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

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

1 голос
/ 27 мая 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";
    }
0 голосов
/ 27 мая 2010

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

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

Существует также шаблон построения, который можно использовать для достижения аналогичного результата, например: new Dvd().setI(i).setY(y) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...