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

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

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

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

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

Q&A

解決済

2回答

993閲覧

なぜAndroidで別クラスのメソッドの実行結果をプロパティとして参照できるのか

hayato-mofnem

総合スコア5

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

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

0グッド

0クリップ

投稿2023/03/05 14:05

知りたいこと

なぜAndroidの「データベースヘルパーオブジェクトのwritableDatabaseプロパティにアクセスする」記述をするだけで、getWritableDatabase()メソッドの実行結果を得ることが出来るのかを知りたい。

前提

「基礎&応用力をしっかり育成! Androidアプリ開発の教科書第3版 Kotlin対応」を読みながらアプリ開発を学習している初学者です。本書257pに、以下の記述が出てきます。(本質問に関連しない部分は省いています)

class MainActivity : AppCompatActivity() { private val _helper = DatabaseHelper(this@MainActivity) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)                ~中略~ fun onSaveButtonClick(view: View) { // 感想欄を取得。 val etNote = findViewById<EditText>(R.id.etNote) // 入力された感想を取得。 val note = etNote.text.toString() // データベースヘルパーオブジェクトからデータベース接続オブジェクトを取得。      //このコードでSQLiteOpenHelperクラス内で定義されているgetWritableDatabase()の実行結果にアクセスしていることはわかるが、なぜこのような記法で書けるのかが分からない。 val db = _helper.writableDatabase ~以下省略~ } }

発生している問題・エラーメッセージ

エラーは発生していないが、なぜ「メソッドの実行結果」に「プロパティにアクセスする記述」でアクセスできるのかが分からずもやもやしている。

試したこと

androidの公式リファレンスを読むも、それらしい情報を見つけ出すことはできなかった。
自分の過去のコードを探したところ、buttonに対して

button.setEnabled(true)

と記述した部分を、AndroidStudioからの提案で

button.isEnabled = true

に書き直していた部分がありました。
これのコードにも本質問と同じ趣旨の疑問を持っています。

環境(FW/ツールのバージョンなど)

Android Studio Electric Eel

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

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

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

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

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

hoshi-takanori

2023/03/05 15:57

Java の getter/setter は、Kotlin ではプロパティの読み書きとして書くことができる、というお約束です。
guest

回答2

0

ベストアンサー

なぜ「メソッドの実行結果」に「プロパティにアクセスする記述」でアクセスできるのか

Kotilin から、 Java で書かれたコード中にある、一定の規約に従ったメソッドを呼ぶ場合、そのようにできる仕様になっているからです。

https://kotlinlang.org/docs/java-interop.html#getters-and-setters

Methods that follow the Java conventions for getters and setters (no-argument methods with names starting with get and single-argument methods with names starting with set) are represented as properties in Kotlin. Boolean accessor methods (where the name of the getter starts with is and the name of the setter starts with set) are represented as properties which have the same name as the getter method.

(訳)

JavaのGetterとSetterの規約に従ったメソッド(getで始まる名前の無引数メソッドとsetで始まる名前の単一引数メソッド)は、Kotlinではプロパティとして表現されます。
Bool 値のアクセサーメソッド(Getter 名が is で始まり、Setter 名が set で始まる)は、Getter メソッドと同じ名前を持つプロパティとして表現されます。


これを質問者さんの例にあてはめると

kt

1val db = _helper.writableDatabase

_helper は、DatabaseHelper オブジェクトですが (質問文のコードの2行目)、
DatabaseHelper オブジェクトは SQLiteOpenHelper を継承しているはずです。

そして、SQLiteOpenHelper は、

kt

1import android.database.sqlite.SQLiteOpenHelper

というインポート文によってインポートされているはずです。

実はこのandroid.database.sqlite.SQLiteOpenHelper
というパッケージは、Java で書かれています

Kotlin では android.database.sqlite.SQLiteOpenHelperの中にある

  • getで始まる名前の無引数メソッド (Getter)
  • setで始まる名前の単一引数メソッド (Setter)

を、 Kotlin 側から 「先頭の ”set”/"get"を除いて、次の文字を小文字にした名前(=プロパティの形式)」でアクセスできるように、自動的に解釈します。
(この2点が冒頭で言及した「一定の規約」の一部です)

これにより、
.writableDatabase という「プロパティ形式の記法」で、getWritableDatabase() という Getter メソッドを呼び出せます。


isEnabled(bool) -> setEnabled
も同じことです。

上記公式ドキュメントの引用後半

Bool 値のアクセサーメソッド(Getter 名が is で始まり、Setter 名が set で始まる)は、Getter メソッドと同じ名前を持つプロパティとして表現されます。

の部分がまさにこれです。
(button のクラスに、isEnabled() という Getter があるはず)


 
Java のように「すべてを明示的に定義するプログラミング言語」に慣れている方からすると、このような仕様は不思議に感じるかもしれませんが、結果として、Kotlin の別の仕様である、自動 Getter/Setter との一貫性や、コード記述量の削減に貢献するものとなっています。

--
この回答をするにあたって参考にした資料:
Kotlinの言語リファレンス

投稿2023/03/05 22:11

編集2023/03/12 01:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hayato-mofnem

2023/03/12 13:17 編集

大変わかりやすい説明に加え参考URLまで貼っていただきありがとうございます! Kotlin側の親切設計だったわけですね。非常に親切に対応いただいたこの方にBAを出したいと思います。
guest

0

エラーは発生していないが、なぜ「メソッドの実行結果」に「プロパティにアクセスする記述」でアクセスできるのかが分からずもやもやしている。

たんに、メソッドの実行結果が、クラスのインスタンス、だったというだけでしょう

投稿2023/03/05 20:38

y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問