2016-02-22 3 views
-1

Текст упражнения из хорошо известного и базового учебника по программированию на Java:Что здесь за конструктор?

«Иногда нам нужен класс с единственным уникальным экземпляром. Создайте класс Merlin, который имеет один атрибут, theWizard, который является статичным и типа Merlin. Класс имеет только один конструктор и два метода: * Merlin - частный конструктор. Только этот класс может ссылаться на этот constrc- tor; ни один другой класс или программа не может создать экземпляр Merlin * summon -a статический метод, который возвращает Wizard, если он не равен NULL; если theWizard имеет значение null, этот метод создает экземпляр Merlin с использованием частного конструктора и присваивает его Wizard перед его возвратом. * консультируйтесь-не-статический метод, который возвращает строку «Вытащите меч из камня» '

Вы были в состоянии понять, что автор просит в пункте' Merlin -a частный конструктор? Я знаю, что такое конструктор, и что такое частный метод. Но вот какой ответ? Я думал, что-то вроде

public class Merlin { 
    private static Merlin theWizard; 

    /*public Merlin() 
    { 
     ??? 
    }*/ 

    private Merlin() 
    { 
     this(); 
    } 

    public static Merlin summon(Merlin theWizard) { 
     if (theWizard == null) { 
      theWizard = new Merlin(); 
     return theWizard; 
    } 

    public String consult() { 
     return "Pull the sword from the stone"; 
    } 
} 

и конечно JavaBeans говорит «частный Merlin() рекурсивно. Итак, что мне делать? Следующее упражнение связано с вышеупомянутым и может помочь вам понять, что такое ответ; здесь это:

  1. Создайте программу, которая проверяет класс Merlin, описанный в предыдущем упражнении.
    • Используйте метод toString, чтобы убедиться, что был создан уникальный экземпляр.

Большое спасибо за все, что вы будете в состоянии сказать мне.

+3

Ну конструктор только рекурсивная, потому что у вас есть 'это()' в этом ... –

ответ

1

Это экземпляр шаблона Singleton; в вашем случае просто замените this() на super(), чтобы использовать конструктор суперкласса (технически, если вы не разместите вызов суперконструктора, компилятор будет вставлять его для вас, поэтому вы можете просто удалить его).

Пища для размышлений:

  • почему класс Merlin private?
  • Почему класс Merlin static?
  • где остальная часть вашего кода?
+0

Остальная часть моего кода: общественный статический Merlin вызвать (Merlin theWizard) { если (theWizard == NULL) { theWizard = новый Merlin(); } else { } возвращение theWizard; } public String consult() { возвращение «Вытащить меч из камня»; } Это статично, поскольку по своей природе c –

+0

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

+0

Благодарю вас за ваш ответ. Я попытаюсь выполнить упражнение 9. Является ли использование super(), которого я еще не достиг в книге, единственный ответ на эту проблему? Еще раз спасибо. –

1

Избавьтесь от this():

public class Merlin { 

    private static Merlin theWizard; 

    private Merlin() {} 
    ... 
} 

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

В конструкторе разрешено вызывать super() (он вызывает конструктор без аргументов в суперклассе, который здесь java.lang.Object), но не требуется, компилятор будет вставлять вызов super, если вы этого не сделаете.

Кстати, вы не можете иметь несколько перегрузок конструктора или метода с тем же списком аргументов. У вас нет публичного конструктора no-arg и частного конструктора no-arg.

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

+0

Великий Натан! Вы избавились от моих последних сомнений. Большое вам спасибо! –

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