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

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

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

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

5回答

3528閲覧

引数を使用しない値の渡し方

MISHIRO

総合スコア27

Java

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

1クリップ

投稿2017/06/20 03:17

編集2017/06/20 04:53

isObjectでrequest,user,checkSetを使いたいです
isObjectはOverrideしているためこれ以上引数を増やすことができません。
このような場合はrequestを使うことはできないのでしょうか

*フィールド変数には設定できないものとします。
*抽象クラスをいじることもできないものとします。
*このクラスに新しくメソッドや変数を追加することは可能です。
*下記のものはあくまで例です。
*UserクラスとCheckSetクラスが存在するものとします。

java

1継承元の抽象クラス 2 3public abstract class answer extends HttpServlet { 4 5 private static final long serialVersionUID = 1L; 6 7 // サーブレットのコントロール 8 protected abstract void control(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; 9 10 11 protected abstract boolean isObjectEnabled(Object user, Object inputValueCheckSet); 12 13} 14 15 16////////////////////////////////////////////////////////////////////////////////////////// 17servletクラス 18 19 20@WebServlet("/test") 21public class test extends answer{ 22private static final long serialVersionUID = 1L; 23 24 protected void doPost(HttpServletRequest request, HttpServletResponse response) 25 throws ServletException, IOException { 26 control(request, response); 27 } 28 29@Override 30 protected void control(HttpServletRequest request, HttpServletResponse response) 31 throws ServletException, IOException { 32 33HttpSession session = request.getSession(); 34User user = (User) session.getAttribute("user"); 35CheckSet checkSet = new CheckSet(request); 36 37 38if(isObject(user,checkSet)==false){//本当ならここでrequestも引数として渡したい 39//このような感じで帰ってきたboolean値によって処理を行うか決めています。 40} 41 4243 44 @Override 45 protected boolean isObject(Object object , Object value){ 46 47 User user = (User) object; 48 CheckSet checkSet = (CheckSet) value; 49 50//ここでrequestを使いたいのですが値を渡していないので使えないのが現状です。 51HttpSession session = request.getSession(); 52int action_Value = (int) session.getAttribute("action_Value"); 53 54return setUpdateValue(action_Value, user, checkSet); 55 56 } 57private boolean setUpdateValue(int action, User user, CheckSet checkSet) { 58 GetTime get_now_time = new GetTime(); 59 switch (action) { 60 61 case 0: 62 if (checkSet.validateInputValueLoginID()) { 63 64 user.setLogin_id(checkSet.getLogin_id()); 65 user.setModified_ymd(get_now_time.getNowTime()); 66 return true; 67 } else { 68 return false; 69 } 70 71 case 1: 72 if (checkSet.validateInputValueLoginID()) { 73 74 user.setPass(checkSet.getPass()); 75 user.setModified_ymd(get_now_time.getNowTime()); 76 return true; 77 } else { 78 return false; 79 } 80 81//これより下のswitch文に関しては長くなるので省きます 82}

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

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

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

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

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

ozwk

2017/06/20 03:33

そもそもstaticメソッドってオーバーライドできないんですが、とりあえずそれは置いておけばいいんですか?
MISHIRO

2017/06/20 03:37

すみません。早急に作ったものだったのでそこまで気にしていませんでした。気にしないでいただければ助かります
ozwk

2017/06/20 04:00

抽象クラス側の追記と、コードはコード用の記法で書いてください
mattn

2017/06/20 04:03

更新された質問についてですが、Override した isObject を呼び出さないといけない理由はなんでしょうか?isObject 等という名前でなくまったく別のメソッドを実装してしまえば良いだけに見えます。isObject を呼び出さないといけない理由を明確に書かれた方が良いと思います。
MISHIRO

2017/06/20 04:12

修正しました。不備ばかりで申し訳ありません
guest

回答5

0

ベストアンサー

そもそもなんですが、test#isObject(int a,int b)はstaticですが、オーバーライドできないのでは?
isObjectがstaticでないとして話をすすめますと問題の同名引数違いのメソッドは問題なく定義可能です。
(オーバーライドそのものです。Javaはオーバーライドできます。)

Java

1void isObject(int a,int b,int c){ 2System.out.print(a+b+c); 3} 4}

これはisObject(int a,int b)とは別物です。
answerに同一シグニチャのインスタンスメソッドがいてfinal修飾されているとかだと話は別ですが。

投稿2017/06/20 03:44

kurokoba

総合スコア276

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

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

MISHIRO

2017/06/20 03:58

回答ありがとうございます。 質問を先ほどよりわかりやすく変更しましたので見ていただけませんでしょうか
kurokoba

2017/06/20 04:36

そもそもprotected boolean isObject(Object object , Object value)使う必要があるのでしょうか? どうしても必要な理由次第でベストな方法は変わると思います。 ごり押しなら引数がObject 型であることを利用して器のクラスでくるむという手など考えられますが、 例えばisObjectがフレームワーク側でつかわれているとかであればある無理な可能性があります。 ちなみに別の方が書いてますがインスタンス変数を使うのであればスレッドセーフかどうかは重要です。 生のサーブレットのHttpServletRequestやStruts1.xのActionなどはスレッドアンセーフなので気を付けてください(ごり押しならThreadLocal)。
MISHIRO

2017/06/20 05:12

抽象クラスも追記しました。 抽象クラス側で protected abstract boolean isObjectEnabled(Object user, Object inputValueCheckSet); と実装しているので実装しないとエラーをはいてしまうので使おうとしています。 isObjectクラスではインスタンスにはいった番地を利用して入力された値が有効かどうかをチェックするクラスとなっています。 自分はスレッドセーフに対する理解がまだまだ甘いようです。 フィールド変数をなくしたら解決するだろうと考えていました。 調べて考えなおした方がよさそうです。
kurokoba

2017/06/20 08:35

抽象クラス作成者の意図として、isObjectEnabled(isObject)には"チェックロジックをわかりやすくしてくださいね"以上の意味は無いと解釈します。 例えばTemplate Methodパターンのように抽象クラス側の処理フローの中でisObjectEnabled(isObject)が使われているなら問題ですが、そういう作りではなさそうなので。 では第2引数のObject valueでHttpServletRequest とCheckSetの複合オブジェクト渡しちゃえばどうでしょうか? class CheckEntity{ private final HttpServletRequest request; private final CheckSet checkSet; CheckEntity(final HttpServletRequest request,final CheckSet checkSet){ this.request = request; this.checkSet = checkSet; } HttpServletRequest getRequest(){ return request; } HttpServletRequest getCheckSet(){ return checkSet; } } ... if(isObject(user,new CheckEntity(request,checkSet))==false)
kurokoba

2017/06/20 08:47

ちなみにスレッドセーフ云々ですが、すごく乱暴な言い方をすれば「フィールド変数をなくしたら解決するだろう」でとりあえずOKです(逆にいうとインスタンスのライフサイクルを知らないでフィールドで情報やりとりするのは危険)。サーブレットに関していえばHttpServletRequestのインスタンスのライフサイクルはサーブレットコンテナが管理してますが、これらはスレッドアンセーフ。
MISHIRO

2017/06/20 10:21

別のクラスを用意してコンストラクタでRequestとCheckSetを設定し、 getterで取得するのですね。 なるほどです!! ですが上記のコードの場合はスレッドアンセーフではないのでしょうか? privateにはしていますがフィールド変数になっているのでダメな気がするのですが... 理解が追い付かず申し訳ありません。
kurokoba

2017/06/20 10:56

結論からいえばdoPostの中でnewされたインスタンスなら大丈夫です。 問題は"スレッド間で同じ場所を見てしまうかどうか"です。 ステップアップのため"一度ちゃんと勉強してみる"のが良いとおもいますが(実はちゃんとわかってる人が少ないところでもありますが)、とりあえず間違えないための目先の行動としては 「メソッド内で宣言された変数なら大丈夫」 です。なので public class HogeServlet extends HttpServlet { private Hoge hoge; @Override protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { hoge = new Hoge(); } } これはNG。 public class HogeServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { Hoge hoge = new Hoge(); } } これはOK。 http://www.ne.jp/asahi/hishidama/home/tech/java/j2ee/servlet.html
MISHIRO

2017/06/20 11:17

なるほど。 自分でも調べてみたところメソッド内でインスタンス化したクラスはローカル変数扱いとなるということを知りました。 kurokobaさんがおっしゃっていることですね。 すごく理解できました。 ですがまだ足りない部分もあるのでもう一度勉強してみようと思います。 長時間にわたりありがとうございました。
guest

0

全て同じ型、役割が同じなら可変引数にしたらいいですよ。

投稿2017/06/20 03:28

yona

総合スコア18155

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

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

MISHIRO

2017/06/20 03:32

回答ありがとうございます。 すみません。 例えが悪かったです。 実際はそれぞれ別の型の引数になっています。 修正しておきます。
MISHIRO

2017/06/20 03:59

質問を先ほどよりわかりやすく変更しました
guest

0

オーバーロードといって引数違いの同名メソッドを作成することが出来るので
isObject(int a,int b,int c)を作ればいいのではないでしょうか。

投稿2017/06/20 03:26

7tsuno

総合スコア310

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

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

MISHIRO

2017/06/20 03:31

回答ありがとうございます。 オーバーロードをしてしまうとオーバーライドしたisObjectというメソッドの必要性がなくなってしまうのではないでしょうか? 何もせずにメソッドだけあるというのは少し違和感を覚えます。
ozwk

2017/06/20 03:45

継承っていうのは、継承前のクラスとしても扱えることに意味があるので、 引数などシグネチャが違うものが派生クラスにあって、 それしか使わない時点でそもそも継承の必要がありません。
MISHIRO

2017/06/20 04:02

なるほど では根本的な考え方から間違っているということですね。 もし仮に質問のようにやるとした場合は他に手段はあるのでしょうか。 質問を先ほどよりわかりやすく変更しましたので見ていただけないでしょうか
guest

0

エスパーでもう一度回答します。抽象クラスの処理をシグネチャ同じのまま改変したい、そう感じ取りました。Foo の isObject では Bar の isObject の処理を行った後、s (この質問でいう request) を使っています。おそらく呼び出し元が以下の例の様に、isObject でない、別の物なのかと想像します。

java

1abstract class Bar { 2 boolean isObject(Object object , Object value){ 3 System.out.println("bar"); // この出力だけは絶対に行いたい 4 return false; 5 } 6 7 public void doSomething() { 8 this.isObject(1, 2); 9 } 10} 11 12public class Foo extends Bar { 13 String s; 14 15 public static void main(String[] args) { 16 Foo f = new Foo(); 17 synchronized(f) { 18 f.s = "foo"; 19 f.doSomething(); 20 } 21 } 22 23 @Override 24 protected boolean isObject(Object object , Object value){ 25 // Bar#isObject を呼ばせる 26 super.isObject(object, value); 27 28 // その後独自の処理をしたい 29 System.out.println(s); 30 return true; 31 } 32}

ただし Foo#s が状態変数になってしまっていますので、良いコードとは言えません。

投稿2017/06/20 04:23

mattn

総合スコア5030

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

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

kurokoba

2017/06/20 04:39

(補足)スレッドセーフであるかどうかは気にしてください(サンプルから推測するにちょっと怪しい...。)
mattn

2017/06/20 04:43

捕捉ありがとうございます。 この回答を見られる方へ:お手本ではないです。ご注意ください。
MISHIRO

2017/06/20 04:50

抽象クラスについても質問に追記しておきます。 わざわざコードまで書いていただきありがとうございます。 自分はまだまだ初心者なので理解がおいつかず自分のコードと合わせてみることができません。 間違っていることがありましたら指摘お願いします。 Barクラスは継承元のクラスでisObjectとdoSomethingメソッドがある doSomethingを実行すると呼び出したクラスのisObjectに引数として1,2を渡して実行される。 FooクラスにはmainとisObjectメソッドがある。 synchronized(f)で鍵?をかけているので同時アクセスされた場合でも問題がない? フィールド変数に"foo"を代入 FooクラスのisObject引数1,2を渡し実行 さらにその中で継承元のisObjectを実行 上記のような理解で大丈夫でしょうか これをどのように使えばいいのかさっぱりです... スレッドセーフについては気にしているつもりなのですが それはフィールド変数をなくすことによって問題なくなると考えていましたが そのようなこともないようなのでもう一度考え直してみます。
mattn

2017/06/20 04:55

説明頂いた処理手順であっています。synchronized については、このコードを見る方が「あ、排他が必要だ」と気づいてくれればと思って書いただけですので、本来ならば隠ぺいなどの策が必要です。
MISHIRO

2017/06/20 04:59

隠ぺいすることができることはしりませんでした。 調べて理解できるようであれば実装してみようと思います
guest

0

なぞなぞか何かでしょうか?

  • isObject を修正する事ができない。
  • オーバーロードしたくない

この条件で、結果だけ期待値にしたいならば

java

1isObject(a, b+c);

で良いんではないでしょうか。

投稿2017/06/20 03:35

mattn

総合スコア5030

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

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

MISHIRO

2017/06/20 03:41

回答ありがとうございます。 わかりづらい質問でも申しわけありません 少し自分の質問が悪いようです。 書き直してもう一度質問しようと思います。
MISHIRO

2017/06/20 03:58

質問を先ほどよりわかりやすく変更しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問