###前提・実現したいこと
javaのようにユーティリティクラスを書くには?
###結論
object(Singleton)であれcompanion objectであれ参照が渡されるだけでインスタンス化はされない。
そのため、インスタンス化を避けたいのであれば単純にobjectを利用すればよい
新たに名前をつけ参照を保存することを回避したいのであれば
名前空間に直接に関数や定数を定義すれば良い
kotlinを使い始めてsingletonがなぜ「object」なのかと不思議には思っていましたが
ユーザがアクセスする時点でメモリ領域に確保(インスタンス化)されており、「実体のある物体」だからだとわかった
###該当のソースコード
kotlin
1fun main(args : Array<String>){ 2 3 4 val p1 = PhysicalConstants().AVOGADROS_NUMBER //Cannot access `<init>` : it is private in 'PhysicalConstants' 5 //アクセスできない 6 7 val p2 = PhysicalConstants //PhysicalConstants.Companion が渡される 8 p2.AVOGADROS_NUMBER 9 //アクセスできるがcompanion objectを外に出して(インスタンス化)している 10 11//companion objectもインスタンス化できないようにしようとしたがobjectにはコンクラスタは定義できない 12//そのためcompanion object の中にprivate constructor()は定義でない 13 14} 15 16 17class PhysicalConstants{ 18 private constructor() 19 companion object { 20 val AVOGADROS_NUMBER = 6.022 21 } 22 } 23 24//singleton 25object PhysicalConstants{ 26/../ 27 28//objectなのでコンクラスタは定義できない 29//そのため上記と同様、インスタンス化は防げない 30} 31//としてシングルトンを作成できることは知っていまいすが 32//「シングル」のインスタンスさえ作成させたくない 33 34//javaならばこのようなユーティリティクラスの実現 35public Util{ 36 private Util(){} 37 38 public static int utilMethod(){/../} 39} 40
###補足情報(言語/FW/ツール等のバージョンなど)
IDE:intelliJ IDEA CE
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。