# Simplifying Constructors

**URL:** <https://discourse.julialang.org/t/simplifying-constructors/40907>\
**Category:** General Usage\
**Created:** [June 7, 2020, 2:30am UTC](https://discourse.julialang.org/t/simplifying-constructors/40907 "2020-06-07T02:30:51Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![virtualgraham](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/virtualgraham/32/15200_2.png) [@virtualgraham](https://discourse.julialang.org/u/virtualgraham)\
**Post date:** [June 7, 2020, 2:30am UTC](https://discourse.julialang.org/t/simplifying-constructors/40907/1 "2020-06-07T02:30:51Z")

</div>

Is there a better way to define a constructor that allows for optional params or a small amount of logic without having to rewrite all the properties three times?

```nohighlight
mutable struct AcRepertoireIrreducibilityAnalysis <: Orderable
    self,
    alpha,
    state,
    direction,
    mechanism,
    purview,
    partition,
    probability,
    partitioned_probability,
    node_labels
    
    function AcRepertoireIrreducibilityAnalysis(
        self,
        alpha,
        state,
        direction,
        mechanism,
        purview,
        partition,
        probability,
        partitioned_probability,
        node_labels=nothing,
    )

    new(
        self,
        alpha,
        state,
        direction,
        mechanism,
        purview,
        partition,
        probability,
        partitioned_probability,
        node_labels
    )
   end
end

```

---

<div class="post-metadata">

**Author:** ![apo383](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/apo383/32/11272_2.png) [@apo383](https://discourse.julialang.org/u/apo383)\
**Post date:** [June 7, 2020, 6:51am UTC](https://discourse.julialang.org/t/simplifying-constructors/40907/2 "2020-06-07T06:51:00Z")

</div>

Try [`Parameters.jl`](https://mauro3.github.io/Parameters.jl/stable/). From their documentation,

```julia
julia> using Parameters

julia> @with_kw struct A
           a::Int = 6
           b::Float64 = -1.1
           c::UInt8
       end

julia> A(c=4)
A
  a: 6
  b: -1.1
  c: 4

```

---

<div class="post-metadata">

**Author:** ![apo383](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/apo383/32/11272_2.png) [@apo383](https://discourse.julialang.org/u/apo383)\
**Post date:** [June 7, 2020, 6:53am UTC](https://discourse.julialang.org/t/simplifying-constructors/40907/3 "2020-06-07T06:53:16Z")

</div>

By the way, I think you don’t need your definition of `new()` which looks like the default constructor anyway. Thus saving you rewriting one time.

---

<div class="post-metadata">

**Author:** ![lungben](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lungben/32/12314_2.png) [@lungben](https://discourse.julialang.org/u/lungben)\
**Post date:** [June 7, 2020, 7:20am UTC](https://discourse.julialang.org/t/simplifying-constructors/40907/4 "2020-06-07T07:20:21Z")

</div>

This functionality is now also available in Base as `Base.@kwdef`.
