Construção estilo GObject
Vala suporta um esquema alternativo de construção que é levemente diferente dos descritos anteriormente. Esse esquema é mais parecido com o jeito que os GObject são construidos. Qual você vai preferir vai depender se você veio dos lado dos GObjects ou do Java e/ou C#. O esquema de construção dos GObject introduzem novos elementos sintáticos:
propriedades de construção, uma chamada especial Object(...)
e um bloco construct
. Vamos dar uma olhada no funcionamento:
public class Person : Object {
/* Construction properties */
public string name { get; construct; }
public int age { get; construct set; }
public Person(string name) {
Object(name: name);
}
public Person.with_age(string name, int years) {
Object(name: name, age: years);
}
construct {
// do anything else
stdout.printf("Welcome %s\n", this.name);
}
}
Com o esquema de construção do estilo GObject cada método de construção só pode conter uma chamada Object (...)
para determinar os tão falados propriedades de construção(construct properties). A chamada Object (...)
recebe um variável número de argumentos nomeados na forma de propriedade: valor
. Essas propriedades precisam ser declaradas como construct
ou set
. Elas serão atribuídas com os dados valores e depois todos blocos construct {}
na hierarquia do GLib.Object abaixo da nossa classe será chamado.
O bloco construct
é garantido de ser chamadoquando uma instância da classe é criada, mesmo se ela for criada como um subtipo. Não tem parâmetros ou retorno de valores. Dentro desse bloco você pode chamar outros métodos e atribuir variáveis membros que forem necessárias.
Propriedades de construção são definidas como propriedades get
e set
, e portanto podem executar códigos arbitrários na atribuição. Se você precisa fazer inicializações baseado numa única propriedade de construção, é possível escrever um bloco construct
personalizado para a propriedade, que será executado imediatamente na atribuição, e antes de outros códigos de construção.
Se uma propriedade de construção é declarada sem set
ela será uma tão falada propriedade somente construção, que significa que só pode ser atribuida na construção. No exemplo abaixo name é uma propriedade somente construção.
Aqui temos um sumário de vários tipos de propriedades juntas com nomenclaturas usualmente encontradas na documentação de bibliotecas baseadas em GObject.
public int a { get; private set; } // Read
public int b { private get; set; } // Write
public int c { get; set; } // Read / Write
public int d { get; set construct; } // Read / Write / Construct
public int e { get; construct; } // Read / Write-Construct-Only
Em alguns casos você também vai querer executar algumas ações - não quando instâncias das classes são criadas - mas quando a classe propriamente dita é criada na execução dos GObject. Na terminologia dos GObject nós estamos falando sobre os trechos de código que rodam dentro da função class_init
para a classe em questão. Em Java isso é conhecido como static initializer blocks(Blocos de inicialização estática). Em Vala isso se parece assim:
/* This snippet of code is run when the class
* is registered with the type system */
static construct {
...
}