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

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

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

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

Q&A

解決済

5回答

1525閲覧

Javaのゲッター、セッターでクラスの種類を格納することはできますか?

tiqua_nibio

総合スコア62

Java

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

0グッド

0クリップ

投稿2020/04/15 03:53

ゲッター、セッターで取り出しされるObjectのクラスの判別をしたいときにどうしたらいいか?という疑問がわきました。

Java

1 public class Insert_Column { 2 3 protected Object val; 4 public void setVal(Object val) { this.val = val; } 5 public Object getVal() { return val; } 6 7 protected String class_name; 8 public void setClass_Name(String class_name) { this.class_name= class_name; } 9 public String getClass_Name() { return class_name; } 10 11 12 } 13

このコーディングの場合、

Java

1Insert_Column ic = new Insert_Column(); 2 3ic.setClass_Name("String"); 4ic.setClass_Name("int"); 5ic.setClass_Name("boolean"); 6 7switch(ic.getClass_name()){ 8 9case "String": 10 11 break; 12 13case "int": 14 15 break; 16 17case "boolean": 18 19 break; 20 21} 22

などの書き方ができ、これを取り出してクラス名を判別して処理を分岐させたいのですが、一歩進んで

Java

1 protected ??? class_name; 2 public void setClass_Name(??? class_name) { this.class_name= class_name; } 3 public ??? getClass_Name() { return class_name; }

???のところにStringの代わりに何かを書いて「クラスそのもの」を入れたりすることはできないのでしょうか?
もし良い方法がありましたら教えていただけますと幸いです。

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

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

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

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

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

maisumakun

2020/04/15 04:06

「1つのリストに多様な型を入れる」のでしょうか、それとも「1つのリストには同じ型」でしょうか。
tiqua_nibio

2020/04/15 05:06

List<Insert_Column>のvalに多様な型を入れる、という解釈になります。
guest

回答5

0

ベストアンサー

他の方の回答通り、Classオブジェクトを使うのが手だと思います。
ただし、現在の設計だと、値とクラスを別々に操作できてしまうため、整合性のかけらもありません。
整合性を取るとしたら、例えばこのようなコードになるでしょうね。

java

1 public class Insert_Column { 2 3 protected Object val; 4 protected Class<?> class_name; 5 6 public void setVal(Object val) { 7 if (val == null) { 8 class_name = null; 9 } else if (class_name == null) { 10 class_name = val.getClass(); 11 } else if (!class_name.isInstance(val)) { 12 throw IllegalArgumentException("Type mismatch; Type: " + class_name.getName() + ", val: " + val.getClass().getName()); 13 } 14 this.val = val; 15 } 16 public Object getVal() { return val; } 17 // class_name側の処理は面倒になったので省略 18 }

投稿2020/04/15 05:44

swordone

総合スコア20651

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

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

0

クラスの判別

でしたら instanceof では如何でしょうか.
Javaで型を判断するinstanceof 基本や考え方、応用までズバリ解説!

ただ, 基本的に「何でも入るモノ」は扱いに困るものです. 何が出来る/何に使えるモノが入っているのか分からないからです.
闇鍋には何を入れてもいいですが原則「食べられるモノ」となっているからこそ「食べる」ことが出来るのと同じで, 原則「〇〇であるモノ」という基本型を決めた上でサブクラス/ジェネリクスを用いて処理を行うのが良いのではと思います.

投稿2020/04/15 05:29

編集2020/04/15 05:48
jimbe

総合スコア12632

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

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

tiqua_nibio

2020/04/16 02:05

ありがとうございました。参考になりました。
guest

0

List<Insert_Column>のvalに多様な型を入れる、という解釈になります。

Classオブジェクトを使ってみるのも一案かもしれません。

もっとも、「クラス名を判別して処理を分岐させたい」ということ自体、Javaではあまり良くないパターンです。ジェネリクスやポリモーフぉズムを活用して、「名前で分岐」ということ自体を排除すべきです。

投稿2020/04/15 05:08

maisumakun

総合スコア145183

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

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

tiqua_nibio

2020/04/16 02:06

ありがとうございました。参考になりました。
guest

0

クラスそのものを表す型として、Class という名前のクラスがあります。Class<T> とすることで T またはそのサブクラスに制限することもできます。制限しない場合は Class<?> とします。
参考: java.lang.Class (Java Platform SE 8)

Class<?> cls = obj.getClass(); とか if (cls.isInstance(obj)) { ... } とか書けますが、残念ながら switch 文では使えないようです。

また、何をやりたいかにもよりますが、普通はジェネリクス (総称型) を使った方がいいと思います。
参考: JavaのGenerics(ジェネリクス・総称型)は神機能! - Qiita

投稿2020/04/15 04:07

編集2020/04/15 04:35
hoshi-takanori

総合スコア7895

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

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

tiqua_nibio

2020/04/16 02:06

ありがとうございました。参考になりました。 >Class<?> cls = obj.getClass(); とか if (cls.isInstance(obj)) { ... } とか書けますが、 これに関しては、一つ勉強になりました。
guest

0

本来アンチパターンかもしれませんが型をObjectにすれば何でも入ります。

投稿2020/04/15 03:58

m.ts10806

総合スコア80850

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

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

m.ts10806

2020/04/15 03:59

「class_name」という変数名で役割が伝わるかどうかは一考いただきたく。
tiqua_nibio

2020/04/16 02:06

ありがとうございました。参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問