お世話になっています。
finalクラスとfinalメソッドの利用目的の考え方を踏まえて、
id/passwordを「新規」、「更新」、「削除」したい場合で、
開発者側から判定してほしいのですが。
※更新、削除が複数実行されることを考慮する
dbへのユーザーの追加方法だけ、決定事項として実行する(finalメソッド)
public class LoginAction {
public static void main(String[] args) {
User login = new Login("test","test"); //サブクラスを親クラスにインスタンス化する
int key = 0;
String id="test";
String password="test";
login.check(key, id, password);
}
}
public class Login extends User {
public Login(String id, String password) {
super(id, password);
}
//処理判断
@Override
public void check(int key, String id, String password) {
if(key==0){
insertUser(id,password);
}else if(key==0){
deleteUser(id,password);
}else if(key==2){
updateUser(id,password);
}
}
}
public class User {
public User(String id,String password) {}
/**
* ユーザーの追加(一件)
*/
public final void insertUser(String id, String password) {
//DBに登録
}
/**
* ユーザーの削除(1件)
*/
public final void deleteUser(String id,String password) {
//DBからデータ削除
}
/**
* ユーザーの更新(1件)
*/
public final void updateUser(String id, String password) {
//DBの更新
}
//処理判断
public void check(int key, String id, String password) {
//サブクラスに預ける
}
}
また、この時に、check()メソッドでどの処理かを判断し、メソッドのわたしているのですが、それをコンストラクタで渡したら、
無駄なロスが出そうな気がするのですが。
他に、サブクラスで設定し、親クラスにインスタンス化を実行すると、
何がいいのかがよくわかりません。
親クラスはサブクラスのデータを持っていて、そうすることで最終的に
親クラスから、サブクラスのデータが取れるという感じなのですが。
宜しくお願いします。
No.1
- 回答日時:
何を質問しているのかよくわかりません。
ソースコードはあらゆる部分を間違えています。
どこかの技術者が書いたのであればこらしめるべきです。
この回答への補足
早速の回答ありがとうございます。
>>どこかの技術者が書いたのであればこらしめるべきです
説明不足でした。
一通りJavaを学習したので、自分でfinalをどうして使用して作成してみました。
よければ、悪い点をご指摘頂けないでしょうか?
あと、どういった点に気をつけないといけないのかご指摘して頂けないでしょうか?
厳しい判断、で宜しくお願いします。
No.2
- 回答日時:
ソースコードを見ても何をやりたいのかわからないので、質問者さんが考える仕様と処理の流れを書いてもらえませんか。
この回答への補足
回答ありがとうございます。
実行したい処理は、
条件:finalメソッドを必ず使用する
dbへ接続する為のメソッドをfinalにする
finalメソッドにしようとする理由:サブクラスでオーバーライドされないため
(insertUser/deleteUser/updateUser)
処理方法:id,passwordを追加、更新、削除する
id,passwordが2組以上の処理を行わないものとする
※ id,passwordが1パターンのみ、追加(更新/削除)される
コンストラクタからの受け渡しを不可とする
といった場合で考えています。
また、finalメソッドを使用できる場合の例を挙げてもらえないでしょうか?
宜しくお願いします。
No.3ベストアンサー
- 回答日時:
おはようございます。
#1です。失礼ですが、Javaと言うよりもオブジェクト指向を理解していない気がしますので
もう一度学習し直してみた方が良いかもしれません。
ちなみにfinalは継承で使うよりも、定数やシングルトンで扱う方が圧倒的に多いと思います。
当質問のソースの問題点を雑多に挙げて行くと以下のような感じです。
・親クラスにインスンタンス化するのは意味がないため、しない(可読性の問題)
・keyの比較部分は、比較する値を定数にすべき
・Loginクラスをカプセル化するのであれば、idとpasswordはクラスフィールドにし、各メソッドは引数をとらない
・Loginクラスをカプセル化しないのであれば、コンストラクタは引数をとらない
・今回の場合は、継承よりコンポジションを選ぶべき
#2の方がご指摘されている通り、仕様がわからないため何とも言えませんが
一応修正するなら以下のような感じになると思います。
public class LoginAction {
public static void main(String[] args) {
String id="test";
String password="test";
Login login = new Login(id, string);
// ログイン処理を実施
int key = 0;
login.check(key);
}
}
public class Login {
private static final int KEY_INSERT = 0;
private static final int KEY_DELETE = 1;
private static final int KEY_UPDATE = 2;
/** ユーザー処理クラス? */
private User user = null;
/** コンストラクタ */
public Login(String id, String password) {
user = new User(id, password);
}
public void check(int key) {
if (KEY_INSERT == key) {
user.insertUser();
} else if (KEY_DELETE == key) {
user.deleteUser();
} else if (KEY_UPDATE == key) {
user.updateUser();
} else {
// 引数のキーが処理キーと一致しない場合
}
}
}
public class User {
private final String id = null;
private final String password = null;
public User(String id, String password) {
this.id = id;
this.password = password;
}
/** ユーザーの追加 */
public void insertUser() {
//DBに登録
}
/** ユーザーの削除 */
public void deleteUser() {
//DBからデータ削除
}
/** ユーザーの更新 */
public void updateUser() {
//DBの更新
}
}
詳しいことは麻奈たんに教えてもらって下さい。
http://www.amazon.co.jp/%E3%82%84%E3%81%95%E3%81 …
遅くなり申し訳ありません。
あれから、調べたところ、オブジェクト指向の理解不足でした。
丁寧な回答ありがとうございました。
とても参考になりました。
No.4
- 回答日時:
失礼ですが、日本人ですか?
#2の方の言う通り、何を聞きたいのかさっぱりわからない文章ですよ?
> サブクラスで設定し、親クラスにインスタンス化を実行すると、何がいいのかがよくわかりません。
色々と便利な理由はあるのですが
もっとも大きな理由は他のクラスのメソッドを直す必要がなくなるということですよ。
例えば、Stringクラスの機能を拡張してStringExクラスを作ったとしますよね。
public class StringEx extends String {
public StringEx(String str) {
super(str)
}
}
Stringクラスは非常に一般的なクラスだから色んなクラスのメソッドの引数になってるでしょ?
これを全部StringExも引数に取れるように直してたらめちゃくちゃ大変じゃん。
例えば数字文字列を数値として扱う場合は
String str = "10";
Integer.parseInt(str);
こんな感じですが、これをStringExクラスのインスタンスで行おうとすると
StringEx strEx = new StringEx("10")
String str = strEx
// これはOK
Integer.parseInt(str);
// これはNG
Integer.parseInt(strEx);
つまり、親クラスの変数へキャストできることは
利用する側のメソッドを修正する必要が無くなるメリットがあるわけです。
余談
シングレトンはコンストラクタの修飾子をprivateにして
オブジェクトをひとつ(というか一定数)しか作らないデザインパターンでしょ。
シングレトンにfinal修飾子なんて使わなかったと記憶しているが‥?
遅くなり申し訳ありません。
あれから、調べたところ、オブジェクト指向の理解不足と、finalに関して勉強不足でした。
また、丁寧な回答ありがとうございました。
調べてから、再度回答を読むと何となく理解できました。
No.5
- 回答日時:
#4です
> // これはNG
> Integer.parseInt(strEx);
ごめん、↑もいける。
なんか頭ウニってたわ。
とにかく先に言った通り利点のひとつは、他クラスのメソッドを修正する必要がないこと。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java final 1 2022/06/10 22:49
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- PHP php エラー 2 2022/10/23 16:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c++,ある関数のクラスから別の...
-
クラス間でのデータ参照
-
内部クラスのインスタンスを外...
-
Java リフレクションについて
-
リフレクション
-
Java
-
java-別クラスの変数の使い方を...
-
関数内の変数に<summary>コメン...
-
整数値を任意のオブジェクトを...
-
リレーションエンティティクラ...
-
RPGの主人公、町人、敵キャラの...
-
Javaアプリケーションについて
-
違うクラスからの変数の共有化
-
二つの変数の値を入れ替えるメ...
-
C# log4netの使い方
-
エクセルVBAで、条件に一致する...
-
3年間同じクラスになる確率
-
インスタンス参照でアクセスで...
-
ワイルドカード<?>と型パラメー...
-
「天声人語」をインターネット...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
C#でほかのファイルにある自作...
-
C++でfriendクラスにしているの...
-
java-別クラスの変数の使い方を...
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
ひとつのファイルにクラスは1つ?
-
Java
-
import と extends について
-
継承したクラス側のクラス名の取得
-
SwingでgetContentPaneのエラー...
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
アップキャスト、ダウンキャス...
-
C# インターフェイスの実装
-
visual studioのデザイナ画面で...
おすすめ情報