Как создать «единый диспетчерский объектно-ориентированный класс» в julia, который ведет себя как стандартный Java-класс с открытыми / закрытыми полями и методами

Я прочитал в книге, что «вы не можете создавать традиционные« классы »в julia с методами единой отправки, такими какobj.myfunc()«... и я подумал, что это больше похоже на вызов, чем на факт.

Так вот мойJavaClass Напечатайте с открытыми / закрытыми полями и методами только для того, чтобы испытать шок и ужас от того, что у Джулии было что-то уродливое, после того, как разработчики постарались избежать этого:

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

Пример использования:

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

По сути, конструктор становится замыканием, и именно так создаются «приватные» поля и методы / перегрузки. Какие-нибудь мысли? (Кроме как"OMG Почему ??? Зачем ты это делаешь?")
Любые другие подходы?
Любые сценарии, которые вы могли бы предусмотреть, где это может провалиться эффектно?