アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になっています。
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()メソッドでどの処理かを判断し、メソッドのわたしているのですが、それをコンストラクタで渡したら、
無駄なロスが出そうな気がするのですが。

他に、サブクラスで設定し、親クラスにインスタンス化を実行すると、
何がいいのかがよくわかりません。
親クラスはサブクラスのデータを持っていて、そうすることで最終的に
親クラスから、サブクラスのデータが取れるという感じなのですが。

宜しくお願いします。

A 回答 (5件)

何を質問しているのかよくわかりません。


ソースコードはあらゆる部分を間違えています。
どこかの技術者が書いたのであればこらしめるべきです。

この回答への補足

早速の回答ありがとうございます。
>>どこかの技術者が書いたのであればこらしめるべきです
説明不足でした。
一通りJavaを学習したので、自分でfinalをどうして使用して作成してみました。
よければ、悪い点をご指摘頂けないでしょうか?
あと、どういった点に気をつけないといけないのかご指摘して頂けないでしょうか?
厳しい判断、で宜しくお願いします。

補足日時:2009/08/06 19:15
    • good
    • 0

ソースコードを見ても何をやりたいのかわからないので、質問者さんが考える仕様と処理の流れを書いてもらえませんか。

この回答への補足

回答ありがとうございます。
実行したい処理は、
条件:finalメソッドを必ず使用する
   dbへ接続する為のメソッドをfinalにする
finalメソッドにしようとする理由:サブクラスでオーバーライドされないため
(insertUser/deleteUser/updateUser)
処理方法:id,passwordを追加、更新、削除する
id,passwordが2組以上の処理を行わないものとする
※ id,passwordが1パターンのみ、追加(更新/削除)される
コンストラクタからの受け渡しを不可とする

といった場合で考えています。
また、finalメソッドを使用できる場合の例を挙げてもらえないでしょうか?

宜しくお願いします。

補足日時:2009/08/07 14:33
    • good
    • 0

おはようございます。

#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 …
    • good
    • 0
この回答へのお礼

遅くなり申し訳ありません。
あれから、調べたところ、オブジェクト指向の理解不足でした。
丁寧な回答ありがとうございました。
とても参考になりました。

お礼日時:2009/09/06 19:22

失礼ですが、日本人ですか?


#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修飾子なんて使わなかったと記憶しているが‥?
    • good
    • 0
この回答へのお礼

遅くなり申し訳ありません。
あれから、調べたところ、オブジェクト指向の理解不足と、finalに関して勉強不足でした。
また、丁寧な回答ありがとうございました。
調べてから、再度回答を読むと何となく理解できました。

お礼日時:2009/09/06 19:24

#4です



> // これはNG
> Integer.parseInt(strEx);

ごめん、↑もいける。
なんか頭ウニってたわ。

とにかく先に言った通り利点のひとつは、他クラスのメソッドを修正する必要がないこと。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!