2015-06-12 3 views
1

Так что для класса Toast, он может, по-видимому записать так:Зачем создавать тосты без нового ключевого слова?

Toast toastMessage = Toast.makeText(this, "Hello", Toast.LENGTH_SHORT) 
toastMessage.show(); 

Почему именно это возможно для toastMessage для того, чтобы использоваться в качестве объекта без нового ключевого слова?

Как может быть создан метод toastMessage методом?

+0

Не уверен ... Но, вероятно, так же, как 'SomeClass.getInstance()' для одноэлементных классов ??? Метод 'makeText()' вероятно, создает новый объект или возвращает уже существующий объект. – Codebender

ответ

8

Там нет ничего особенного Toast здесь. Вы просто вызываете статический метод, который создает экземпляр (или может повторно использовать существующий) - это деталь реализации). Это образец, который вы увидите повсюду - например, Calendar.getInstance(). Иногда вы можете вызвать конструктор вместо этого, иногда вы можете только создать экземпляр через статический метод.

Если что-то происходит под капотом, возможно, что где-то в реализации будет вызов конструктора. Вот простой пример:

public final class CreateViaMethod { 
    private final String name; 

    private CreateViaMethod(String name) { 
     this.name = name; 
    } 

    public static CreateViaMethod newInstance(String name) { 
     return new CreateViaMethod(name); 
    } 
} 

Существуют различные причины, почему дизайнер API может хотят, чтобы сделать это. Например, может быть несколько методов «создания» с одинаковыми типами параметров, но разные имена, например.

public static Duration fromSeconds(int seconds) 
public static Duration fromMinutes(int minutes) 
public static Duration fromHours(int hours) 

... Вы не могли бы иметь три перегруженных конструкторов, но вы можете дать Методы разные имена.

2

Это новичок, но довольно хороший. Позвольте мне дать вам общий ответ.

давайте предположим, что у вас есть MyClass, как это:

public class MyClass { 

    public MyClass() {} //constructor 

    public static MyClass generateMyClass() { 
     return new MyClass(); 
    } 

} 

Вы можете использовать MyClass.generateMyClass(), который создает экземпляр MyClass и возвращает его:

MyClass myClassInstance = MyClass.generateMyClass(); 

То же самое с Toast.makeText. Подробнее here.

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