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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

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

Q&A

解決済

2回答

1069閲覧

内部のクラスをインスタンス化して、インスタンスだけ参照させる方法について

gimn

総合スコア39

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

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

0グッド

0クリップ

投稿2023/12/15 03:28

編集2023/12/15 04:23

タイトルの件について、実現方法がわからず質問させていただきます。

クラスAの中にクラスBがあるとして、外側のクラスAでクラスBをインスタンス化します。
インスタンス化したクラスだけを参照させたいのですが、何か方法は有りますでしょうか?
※クラスBをprivateにするとインスタンス自体もprivateにする必要があるため

言語はKotlinを使用しています。

######################################

class A() {
// このインスタンスだけを外部から参照出来るようにしたい
val clsB: B

init { // クラスBのインスタンス生成 clsB= B() } class B() { // このクラスを外部クラスでインスタンス生成して欲しくない(※参照できないようにしたい) ~~~ }

}

######################################

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

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

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

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

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

jimbe

2023/12/15 03:54 編集

どこで何が出来る/出来ないようにしたいのでしょうか。 こういうことが出来てこういうことは出来なくしたいというコードを書いてみてください。 ("クラスBのインスタンス化"というとクラス自体が変化するような感じがして違和感があります。"クラスBのインスタンスを生成"とかのほうが良いのではないでしょうか。)
gimn

2023/12/15 03:55

他のクラスでクラスAを参照する際に、内部のクラスBを個別で参照させたくない(クラスAでインスタンス化したクラスBのみを参照させたい)のです。 つまり、個別にクラスBをインスタンス化して使うのではなく、クラスAで既にインスタンス化されたものをシングルトンのように使って欲しい、というのが目的になります。
gimn

2023/12/15 03:58

申し訳ありません、現在コードを書ける環境では無いため一旦追加で内容だけ記載させていただきます。
jimbe

2023/12/15 04:09

クラス A, B の他にそれらと関係無いクラス (C?) が登場するんですね。 そして、クラス C は直接クラス B を生成できず、クラス A の(インスタンスもしくはコンパニオンオブジェクトの)メソッドでクラス B を得るようにすると。 私は java がメインで kotlin はまだまだ不安れなのですが、 java ならクラス B のコンストラクタを private にしてしまえば良さそうですが kotlin では出来ないでしょうか?
guest

回答2

0

この問題(?)は前から言われているようですね。

Kotlin Discussions
How can I make nested class constructors accessible only by surrounding class?

Stack Overflow
How to create an inner class where only the outer class can access the constructor, but the rest is visible everywhere?

試していたのですが、クラス B をシングルトン的に…ということなら

kotlin

1fun main(args: Array<String>) { 2 var b = A.B 3 b.print() 4} 5class A() { 6 object B { 7 fun print() = println("object B") 8 } 9}

実行結果(paiza.IO)

object B

というのは・・・"的"じゃなくて本当になってしまうのでダメでしょうね x_x

投稿2023/12/15 06:44

編集2023/12/15 07:49
jimbe

総合スコア12648

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

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

0

ベストアンサー

kotlin

1class Outer{ 2 val inner : IInner 3 constructor(){ 4 inner = Inner() // OK 5 } 6 interface IInner{} 7 8 private class Inner : IInner{ 9 constructor(){} 10 } 11} 12 13fun main(args: Array<String>) { 14 val outer = Outer() // OK 15 val inner1 = outer.inner // OK 16 17 val inner2 = Outer.Inner() // error: cannot access 'Inner': it is private in 'Outer' 18 val inner3 = outer.Inner() // error: unresolved reference: Inner 19 val inner4 = Outer.IInner() // error: interface IInner does not have constructors 20} 21

投稿2023/12/15 04:16

編集2023/12/15 04:54
ozwk

総合スコア13528

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

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

ozwk

2023/12/15 04:20

kotlinのこと全然知らずにリファレンス読んで雰囲気で書いたので 「そういうことじゃねぇよ」ってなったらすみません。
ozwk

2023/12/15 04:55

inner class だと Outer.Inner()では呼べないが Outer().Inner()で呼べてしまうので interfaceを挟んだ形に修正しました
gimn

2023/12/15 04:57

回答ありがとうございます。 インナークラスは外部から直接インスタンスの生成は出来ないのですね。 記載いただいた内容で問題ないかと思ったのですが、下記のようにOuterのインスタンスからInnerのインスタンスは生成できてしまうのですね。(そういうやり方がよいかどうかは別として) 下記どちらも制限する方法というのは無いのでしょうか。 X )val inner2 = Outer.Inner() // 直接インスタンスの生成は出来ない 〇)val inner2 = outer.Inner() // Outerクラスのインスタンスからはインスタンスの生成が出来る
gimn

2023/12/15 05:00

回答書いている間に確認したかったことについて追記いただいておりました。 記載いただいたやり方で実現したかったことが出来そうです。 調査いただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問