teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

同じ状況になっているコードを例として載せました。なお、setter云々についてはこちらでもコードを整理しているうちに解決しました。

2018/12/24 23:01

投稿

REIK727
REIK727

スコア23

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,47 @@
1
1
  まずこの分野については超超超初心者なので全体的に乱文となっております。ご了承ください。
2
2
 
3
3
  現在Kotlinを使ってandroidアプリを作っています。その最中、複数のアクティビティで参照したいデータができたのでそれをグローバル変数にすることにしました。グローバル変数はApplicationクラスを継承したクラス(以下Xとする)のメンバとするわけですが、今回のデータはXのメンバ関数onCreate()で初期化した後はXの外からは参照だけできればいいので、書き換えは一切禁止したいです。
4
- そこでいろいろ調べた結果setterをprivateにすれば書き換えはできなくなるとわかったのですが、しかしこの状態でも関数を通じて状態を変更することは可能でした(グローバル変数にしたいものにArrayListが含まれていたが、Xの外からでもadd()を呼び出すことが可能だった)。こうした形での変更すら禁止することは可能なのでしょうか?
4
+ ~~そこでいろいろ調べた結果setterをprivateにすれば書き換えはできなくなるとわかったのですが、~~しかし関数を通じて状態を変更することは可能でした(グローバル変数にしたいものにArrayListが含まれていたが、Xの外からでもadd()を呼び出すことが可能だった)。こうした形での変更すら禁止することは可能なのでしょうか?
5
+
6
+ ---
7
+ グローバル変数を格納しているクラス
8
+ ```kotlin
9
+ package com.example.sample
10
+
11
+ import android.app.Application
12
+
13
+ class Global : Application() {
14
+ /*↓この"al"をGlobalクラスの外から見えるようにはしたいが、中身をいじられたくはない*/
15
+ val al = ArrayList<Int>()
16
+
17
+ override fun onCreate() {
18
+ super.onCreate()
19
+
20
+ /*alの初期化。あくまで一例。*/
21
+ for (i in 0..100) {
22
+ al.add(i)
23
+ }
24
+ }
25
+ }
26
+ ```
27
+ そのグローバル変数を参照しているアクティビティ
28
+ ```kotlin
29
+ package com.example.sample
30
+
31
+ import android.support.v7.app.AppCompatActivity
32
+ import android.os.Bundle
33
+
34
+ class MainActivity : AppCompatActivity() {
35
+ override fun onCreate(savedInstanceState: Bundle?) {
36
+ super.onCreate(savedInstanceState)
37
+ setContentView(R.layout.activity_main)
38
+
39
+ val glob = application as Global
40
+
41
+ /*中身は見たい*/
42
+ val num = glob.al[0]
43
+ /*でもこれはできないようにしたい*/
44
+ glob.al.add(1)
45
+ }
46
+ }
47
+ ```