質問編集履歴

1

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

2018/12/24 23:01

投稿

REIK727
REIK727

スコア23

test CHANGED
File without changes
test CHANGED
@@ -4,4 +4,90 @@
4
4
 
5
5
  現在Kotlinを使ってandroidアプリを作っています。その最中、複数のアクティビティで参照したいデータができたのでそれをグローバル変数にすることにしました。グローバル変数はApplicationクラスを継承したクラス(以下Xとする)のメンバとするわけですが、今回のデータはXのメンバ関数onCreate()で初期化した後はXの外からは参照だけできればいいので、書き換えは一切禁止したいです。
6
6
 
7
- そこでいろいろ調べた結果setterをprivateにすれば書き換えはできなくなるとわかったのですが、しかしこの状態でも関数を通じて状態を変更することは可能でした(グローバル変数にしたいものにArrayListが含まれていたが、Xの外からでもadd()を呼び出すことが可能だった)。こうした形での変更すら禁止することは可能なのでしょうか?
7
+ ~~そこでいろいろ調べた結果setterをprivateにすれば書き換えはできなくなるとわかったのですが、~~しかし関数を通じて状態を変更することは可能でした(グローバル変数にしたいものにArrayListが含まれていたが、Xの外からでもadd()を呼び出すことが可能だった)。こうした形での変更すら禁止することは可能なのでしょうか?
8
+
9
+
10
+
11
+ ---
12
+
13
+ グローバル変数を格納しているクラス
14
+
15
+ ```kotlin
16
+
17
+ package com.example.sample
18
+
19
+
20
+
21
+ import android.app.Application
22
+
23
+
24
+
25
+ class Global : Application() {
26
+
27
+ /*↓この"al"をGlobalクラスの外から見えるようにはしたいが、中身をいじられたくはない*/
28
+
29
+ val al = ArrayList<Int>()
30
+
31
+
32
+
33
+ override fun onCreate() {
34
+
35
+ super.onCreate()
36
+
37
+
38
+
39
+ /*alの初期化。あくまで一例。*/
40
+
41
+ for (i in 0..100) {
42
+
43
+ al.add(i)
44
+
45
+ }
46
+
47
+ }
48
+
49
+ }
50
+
51
+ ```
52
+
53
+ そのグローバル変数を参照しているアクティビティ
54
+
55
+ ```kotlin
56
+
57
+ package com.example.sample
58
+
59
+
60
+
61
+ import android.support.v7.app.AppCompatActivity
62
+
63
+ import android.os.Bundle
64
+
65
+
66
+
67
+ class MainActivity : AppCompatActivity() {
68
+
69
+ override fun onCreate(savedInstanceState: Bundle?) {
70
+
71
+ super.onCreate(savedInstanceState)
72
+
73
+ setContentView(R.layout.activity_main)
74
+
75
+
76
+
77
+ val glob = application as Global
78
+
79
+
80
+
81
+ /*中身は見たい*/
82
+
83
+ val num = glob.al[0]
84
+
85
+ /*でもこれはできないようにしたい*/
86
+
87
+ glob.al.add(1)
88
+
89
+ }
90
+
91
+ }
92
+
93
+ ```