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

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

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

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

Q&A

解決済

5回答

2780閲覧

引数に対応する値を返すだけのメソッドをもつクラス(説明しづらい…)

akamakku

総合スコア191

Java

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

0グッド

0クリップ

投稿2015/07/24 14:39

タイトルがとてつもなくわかりにくいのにもかかわらず見ていただいてありがとうございます。

たとえば、原子番号に対応する原子の電子の数を返すメソッド
get電子の数(原子番号)
だけを使うクラスを作るとします。(データベースみたいな使い方?)
その場合、クラス定義の中にそれぞれの原子番号の原子の電子の数を入れた配列のフィールドとそれを戻り値として返す上記のメソッド書くと思うのですが、これってオブジェクトを生成する必要ありますか?

いまいちオブジェクトを生成する意味がわかっていなくて…

その機能を実現するのにもっと標準的な方法があるとしたら(いや、あるでしょう。)おしえてください。m(__)m

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

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

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

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

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

guest

回答5

0

そういう場合は,staticにするのではないでしょうか.
やりたいのはおそらくこういうことですよね?

java

1public class Atom{ 2 private static final int[] electron = {/* 電子数を配列にする */}; 3 public static int numE(int atomNumber){ 4 return electron[atomNumber - 1]; //配列添字の関係上1引く 5 } 6}

これで呼び出す際はAtom.numE(12);などとすればいいわけです.
オブジェクトを生成する意味はこの場合ありません.

投稿2015/07/24 14:43

編集2015/07/24 14:53
swordone

総合スコア20651

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

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

akamakku

2015/07/24 14:46

そうです!!!! 質問内容を読み解いていただいてさらにこんな素早く回答がいただけるとは思っていませんでした! こういう場合はstaticを使えばいいんですね!勉強になりました!
swordone

2015/07/24 14:52

解決したらベストアンサーを付けていただくと幸いです.
guest

0

java に Math という計算関係のメソッド、定数を集めたクラスがあります。

public final class Math と宣言され、
static double PI // 円周率
static double abs(double a) // double値の絶対値を返します。
など定数、関数が定義されます。
Math は オブジェクトを作れないようになっています。
(オブジェクトをつくれるようにしたとしても、どのオブジェクトも同一動作しかしないので意味がないから)

質問のケースの場合も これを真似するとよいとおもいます。
不変の情報を扱うなら、オブジェクトを生成する必要は無いです。

原子番号に対応する原子の電子の数ではなく、原子番号から元素名を得るメソッドをつくってみました。

java

1public final class Atom { 2 3 private Atom() { 4 } 5 6 // See http://plaza.umin.ac.jp/~ikeda/element.htm 7 private final static String info[][] = { 8 {"水素", "Hydrogen", "H"}, // 1 9 {"ヘリウム", "Helium", "He"} // 2 10 }; 11 12 // 元素番号から 日本語名を得る 13 public static final String getName(int n) { 14 return info[n - 1][0]; 15 } 16 //... 17} 18 19class Main { 20 public static void main(String[] args) { 21 System.out.println("1 = " + Atom.getName(1)); 22 System.out.println("2 = " + Atom.getName(2)); 23 } 24}

実行例:

1 = 水素 2 = ヘリウム

用途に合わせて、 Atom の中での情報の持ち方を工夫したり、メソッドを追加していくことが可能です。
(元素番号から 価電子の数を得る etc...)

投稿2015/07/24 23:38

katoy

総合スコア22324

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

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

0

オブジェクトを生成する必要があるかどうかは、そのデータベース(?)が静的なのか動的なのかで違います。
静的なデータベースなら、ただの関数のようなもので十分です。
動的なデータベースなら、オブジェクトを生成する必要があります。

投稿2015/07/24 16:40

Stripe

総合スコア2183

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

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

0

ベストアンサー

こんにちは。

ある元素についての情報を1レコードとするDBテーブルを作成しないで
済まそうとするなら、列挙型を使うという方法もあります。

以下は例です。(簡略のため原子番号1の水素から9のフッ素までしか
書いておりません。実用的なものにするなら、すべての元素を書く必要
があります。)

java

1package teratail; 2 3public enum Atom { 4 H("水素"), 5 He("ヘリウム"), 6 Li("リチウム"), 7 Be("ベリリウム"), 8 B("ホウ素"), 9 C("炭素"), 10 N("窒素"), 11 O("酸素"), 12 F("フッ素"); 13 14 // 元素名 15 private String name; 16 17 // コンストラクタ(引数として元素名を指定) 18 private Atom(String name) 19 { 20 this.name = name; 21 } 22 23 /** 24 * 指定された原子番号の元素を返す。 25 */ 26 public static Atom byNumber(int atomicNumber) 27 { 28 if ( 0 <= atomicNumber -1 && atomicNumber -1 < Atom.values().length ) 29 return Atom.values()[atomicNumber -1]; 30 31 throw new IllegalArgumentException("指定された原子番号の元素はありません。"); 32 } 33 34 /** 35 * 文字列化 36 */ 37 public String toString() 38 { 39 return ( "原子番号:" + this.getNumber() + ", 元素名:" + this.name ); 40 } 41 42 /** 43 * 元素名を返す。 44 */ 45 public String getName() 46 { 47 return this.name; 48 } 49 50 /** 51 * 原子番号を返す。 52 */ 53 public int getNumber() 54 { 55 return ( this.ordinal() + 1 ); 56 } 57 58 /** 59 * 電子数を返す。(原子番号と同じ) 60 */ 61 public int getNumElectrons() 62 { 63 return this.getNumber(); 64 } 65 66 /* 67 * テスト 68 */ 69 public static void main(String[] args) 70 { 71 int atomicNumber = 6; 72 73 Atom atom = Atom.byNumber(atomicNumber); 74 75 System.out.println("原子番号:" + atomicNumber + " の元素は「" 76 + atom.getName() + "」で、その電子数は " 77 + atom.getNumElectrons() + " 個です。"); 78 79 } 80}

上記のmainメソッドを実行すると、以下のように表示されます。

原子番号:6 の元素は「炭素」で、その電子数は 6 個です。

単なる電子数だと、原子番号と同じ数を返すことになりますが、
たとえば、この列挙型に最外殻電子数を返すメソッド

java

1public int getNumPeripheralElectrons()

を追加したり、あるいは、K、L、M 、N と内側の順に
それぞれの殻の電子数を表す配列を返すメソッドのような
ものを追加するなど、機能拡張が考えられます。

以上、ご参考になれば幸いです。

投稿2015/07/24 15:55

編集2015/07/24 16:08
jun68ykt

総合スコア9058

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

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

akamakku

2015/07/24 16:11

初めて見る書き方で興味深いです! データベーステーブルっていうのもあるんですね! 列挙型というのを初めて聞いたのですが  H("水素"),     He("ヘリウム"),     Li("リチウム"),     Be("ベリリム"),     B("ホウ素"),     C("炭素"),     N("窒素"),     O("酸素"),     F("フッ素"); これが列挙されているということですか?
Stripe

2015/07/24 16:29

その実装だと、列挙じゃなくて、ただの配列になっていると思います。
jun68ykt

2015/07/24 16:53

>列挙型というのを初めて聞いたのですが プログラムで各元素の属性を扱いたいとき、元素記号(H, He, Li … )を 使えるようにしたいですよね。そのときに public enum Atom { H, He, Li  … } のように、要素をまさに列挙して列挙型 Atomを定義することができます。 さらに先のサンプルコードでは、各要素に日本語の元素名を ひもづけるために、private なコンストラクタ private Atom(String name) を定義して、要素を列挙するときにこのコンストラクタを使うように H(“水素”), He(“ヘリウム”), Li(“リチウム”) と、元素名を文字列で指定します。 このように列挙型Atomを定義するとたとえばヘリウムは プログラムの中では Atom.He と書けます。 列挙型を使うと便利な場面として、switch文があります。 Atom a; という変数があったときに switch(a) { case H: //何らかの処理 break; case He: //何らかの処理 break; case Li: //何らかの処理 break; } というふうに、case のあとに、列挙した要素をそのまま書けます。 このように、ある共通のカテゴリー(今の場合、元素記号)に属する 記号(今の場合、H, He, Li …) をJAVAで書くときの選択肢の ひとつとして、列挙型を使うとすっきり書ける場合があるということを 覚えておくとよいと思います。 私の回答の趣旨としては、列挙型というものがあります、ということなので、 データベースにテーブルを作った方がいいのか、列挙型ではなく 通常のクラスとしてAtomを実装した方がいいのかは、ケースバイケースで 考えることになるかと思います。
akamakku

2015/07/25 00:27

質問への回答だけでなく、完全に新しい知識を提供していただいたのでBAにさせていただきます。 ありがとうございました!
jun68ykt

2015/07/25 00:56

どういたしまして。今回のご質問で、 「列挙型って、色々、便利そうだ」 と思われたら、 「EFFECTIVE JAVA 第2版」 http://www.amazon.co.jp/dp/4621066056 の、第6章 enumとアノテーション  にある、列挙型の応用的な使用法を(今の段階では立ち読みでもいいので、) ざっと読んでおくとよいかもしれません。 ちなみに、私の挙げたサンプルでは原子番号を、列挙型の各要素の 序数 this.ordinal()に1を足すという横着なやり方をしていますが、 この実装は、上記の本の教え  項目31  序数の代わりにインスタンスフィールドを使用する に沿ってないです。では、これに沿うなら、どう改善するか? お考えになってみるのも面白いでしょう。
guest

0

原子番号=電子の数なので、原子番号がわかればイオンでない限り電子の数もわかりますよね。
普通は、イミュータブルにして生成時に原子番号を指定、といった形ではないでしょうか?

Java

1public class Atom{ 2 private int number; 3 Atom(int number){ 4 this.number = number; 5 } 6 public int getNumberOfElectrons(){ 7 return this.number; 8 } 9}

また、原子番号に対応する電子の数が知りたければそのまま代入すればいいです。

投稿2015/07/24 14:49

編集2015/07/25 01:47
f_acid

総合スコア56

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

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

f_acid

2015/07/24 14:51

あ、原子のオブジェクトを作りたいという訳じゃなかったんですね・・・ 間違えたようです
akamakku

2015/07/24 14:56

回答ありがとうございます! 自分の説明が下手くそだったんですすみません… 原子番号=電子の数っていうのさえ知らず、設定した例えもばかだったんです。 すみません…
swordone

2015/07/24 15:41

staticなフィールドnumberに対してthis.numberとはできないです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問