Henk Schurink
Henk Schurink

Reputation: 429

Class-based enums in Vala?

I'm wondering how to create class-based enums in Vala.

In Java you can do the following:

public class Main {
    public static void main(String[] args) {
        Action action = Action.COMPRESS;
        System.out.printf("Action name: %s, index %d", action.getName(), action.getIndex());
    }
}

class Action {

    public static final Action COMPRESS = new Action("Compress", 60);
    public static final Action DECOMPRESS = new Action("Decompress", 70);

    private String name;
    private int index;

    private Action(String name, int index) {
        this.name = name;
        this.index = index;
    }

    public String getName() {
        return name;
    }

    public int getIndex() {
        return index;
    }
}

But when I try the following in Vala, COMPRESS and DECOMPRESS are always null when accessing from outside the Action class.

public static int main(string[] args) {
    stderr.printf("Action name: %s\n", UC.Action.COMPRESS.get_name());
}

public class UC.Action : GLib.Object {

    public static UC.Action COMPRESS   = new UC.Action("Compress");
    public static UC.Action DECOMPRESS = new UC.Action("Decompress");

    private string name;

    [CCode (construct_function = null)]
    private Action(string name) {
        this.name = name;
    }

    public string get_name() {
        return name;
    }
}

That code outputs the following: Performing (null).

Any ideas how to accomplish this?

Upvotes: 1

Views: 169

Answers (1)

nemequ
nemequ

Reputation: 17482

In Vala, static class members are initialized during the class_init GObject function, so they're not available until that has been called.

The easiest work-around is to just create an instance; you can throw it away immediately since all you're after is the side-effects.

Upvotes: 3

Related Questions