Como criar um "despacho único, classe orientada a objeto" em julia que se comporta como uma classe Java padrão com métodos e campos públicos / privados

Li em um livro que "você não pode criar 'classes' tradicionais em julia com métodos no estilo de despacho único comoobj.myfunc()"... e eu pensei que isso parecia mais um desafio do que um fato.

Então aqui está o meuJavaClass digite com campos e métodos públicos / privados apenas pelo simples fator de choque e horror de ter algo feio como esse em Julia, depois de todo o problema que os desenvolvedores tentaram evitar:

type JavaClass

    # Public fields
    name::String

    # Public methods
    getName::Function
    setName::Function
    getX::Function
    getY::Function
    setX::Function
    setY::Function

    # Primary Constructor - "through Whom all things were made."
    function JavaClass(namearg::String, xarg::Int64, yarg::Int64)

        # Private fields - implemented as "closed" variables
        x = xarg
        y = yarg

        # Private methods used for "overloading"
        setY(yarg::Int64) = (y = yarg; return nothing)
        setY(yarg::Float64) = (y = Int64(yarg * 1000); return nothing)

        # Construct object
        this = new()
        this.name = namearg
        this.getName = () -> this.name
        this.setName = (name::String) -> (this.name = name; return nothing)
        this.getX = () -> x
        this.getY = () -> y
        this.setX = (xarg::Int64) -> (x = xarg; return nothing)
        this.setY = (yarg) -> setY(yarg) #Select appropriate overloaded method

        # Return constructed object
        return this
    end

    # a secondary (inner) constructor
    JavaClass(namearg::String) = JavaClass(namearg, 0,0)
end

Exemplo de uso:

julia> a = JavaClass("John", 10, 20);

julia> a.name # public
"John"

julia> a.name = "Jim";

julia> a.getName()
"Jim"

julia> a.setName("Jack")

julia> a.getName()
"Jack"

julia> a.x # private, cannot access
ERROR: type JavaClass has no field x

julia> a.getX()
10

julia> a.setX(11)

julia> a.getX()
11

julia> a.setY(2) # "single-dispatch" call to Int overloaded method

julia> a.getY()
2

julia> a.setY(2.0)

julia> a.getY()  # "single-dispatch" call to Float overloaded method
2000

julia> b = JavaClass("Jill"); # secondary constructor

julia> b.getX()
0

Essencialmente, o construtor se torna um fechamento, e é assim que se cria campos e métodos "privados" / sobrecarga. Alguma ideia? (outro que não seja"OMG Por quê ??? Por que você faria isso ??")
Alguma outra abordagem?
Algum cenário que você poderia imaginar onde isso poderia falhar espetacularmente?

questionAnswers(1)

yourAnswerToTheQuestion