質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

4回答

6069閲覧

インスタンス化しないようにする[kotlin]

hanayamaKaoru

総合スコア36

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

1グッド

0クリップ

投稿2017/01/10 15:10

編集2017/01/11 12:20

###前提・実現したいこと
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

yuki_kamikita👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

普通に名前空間直下に関数or定数を置けばいいのではないでしょうか。

Kotlin

1package PhysicalConstants 2 3val AvogadroConstant = 6.0221409e+23

kotlin

1fun main(args: Array<String>) { 2 val x = PhysicalConstants.AvogadroConstant 3 println(x) 4}

投稿2017/01/11 02:27

編集2017/01/11 05:07
ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

とりあえず、

kotlin

1val p1 = PhysicalConstants().AVOGADROS_NUMBER

は、

kotlin

1val p1 = PhysicalConstants.AVOGADROS_NUMBER

ですよね。

「シングル」のインスタンスさえ作成させたくない

Kotlin( & Java)のことは詳しくないのですが、objectで定義したシングルトンは「インスタンス化されている」のでしょうか?(良い言葉が見つからず、うまく説明‥というか質問出来ないのですが‥)

投稿2017/01/11 00:59

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hanayamaKaoru

2017/01/11 01:55

val p1 = PhysicalConstants().AVOGADROS_NUMBER はコンパイルは通りませんがあえてそのように書きました PhysicalConstants()はPhysicalConstants型ですが ()を書かないPhysicalConstantsは PhysicalConstants.Companion型です また、 val p1 = PhysicalConstants.AVOGADROS_NUMBER としたときにインスタンス化していないことはわかっていますが val p1 = PhysicalConstants とすることで PhysicalConstants.Companionがインスタンス化できてしまうことが気にくわなかったのです
fuzzball

2017/01/11 02:02

それが「インスタンス化」なのかどうか?というのが分からないんですけど、どうやって確認しましたか?
hanayamaKaoru

2017/01/11 04:06

早とちりしていました すみません メモリ領域を新たに確保し、渡しているわけではなく PhysicalConstantsクラスの companion objectの参照を渡しているだけでインスタンス化はしていないのでしょうね
guest

0

kotlinにはobjectというものがあります。それを使えばいいと思います。
参考url

投稿2017/01/10 15:26

編集2017/01/10 15:26
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

kotlinは初めてですが、意味的にはSingleton作れば良い話では?

投稿2017/01/10 15:15

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問