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

初めまして、ブラザーと申します。
現在javaの勉強中です。
今回は以下のソースで
private String searchName;
private String searchKind;
private String searchCond;
private ArrayList<Bean> Data;
の4つのクラス変数をクラス変数として使用せずに済ませたいのですが、その方法が分かっていません。
何か方法に心当たりはありませんでしょうか。

(以下ソース)

package database;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import javax.sql.DataSource;

import Bean.Bean;

public class kadai7_database {
private static final String FIND_ALL_STMNT = "SELECT name, price FROM snack";
private static final String FIND_BY_LIKE_NAME_STMNT = "SELECT name, price FROM snack WHERE name LIKE ? ";
private DataSource source;

//以下4つのクラス変数がクラス変数として使用禁止
private String searchName;
private String searchKind;
private String searchCond;
private ArrayList<Bean> Data;




public kadai7_database() throws SQLException {
source = DbManager.getSource();
}


public String setSearchName(String searchName) {
this.searchName = searchName;
return searchName;
}

public String setSearchKind(String searchKind) {
this.searchKind = searchKind;
return searchKind;
}

public ArrayList<Bean> getData() {
return Data;
}





public Object findAll() throws SQLException {

Statement stmt = null;
ResultSet rs = null;
Connection con = source.getConnection();
try {


stmt = con.createStatement();
rs = stmt.executeQuery(FIND_ALL_STMNT);
getData(rs);


} catch (SQLException se) {
se.printStackTrace();
}finally{
con.close();
stmt.close();
rs.close();
}
return Data;
}


public Object findByLikeName() throws SQLException {

PreparedStatement pstmt = null;
ResultSet rs = null;
Connection con = source.getConnection();
try {


pstmt = con.prepareStatement(FIND_BY_LIKE_NAME_STMNT);
pstmt.setString(1, searchCond);
rs = pstmt.executeQuery();
getData(rs);

} catch (SQLException se) {
se.printStackTrace();
}finally{
con.close();
pstmt.close();
rs.close();
}
return Data;
}


public String setSearchCond(){
switch(Integer.valueOf(searchKind)){
case 1:
searchCond = searchName + "%";
break;
case 2:
searchCond = "%" + searchName + "%";
break;
case 3:
searchCond = "%" + searchName;
break;
default:
searchCond = searchName + "%";
}
return searchCond;
}

private ArrayList<Bean> getData(ResultSet rs) throws SQLException{
Data = null;
ArrayList<Bean> Data = new ArrayList<Bean>();
while (rs.next()) {
Bean bean = new Bean();
bean.setName(rs.getString("name"));
bean.setPrice(rs.getString("price"));
Data.add(bean);
}

this.Data = Data;
return this.Data;
}

}

質問者からの補足コメント

  • >クラス変数として使用せずに済ませたい
    >というのはローカル変数にしたいとかそういう意味なんでしょうか

    はい、今のところローカル変数にして対処したいと思っているのですがそうする方法が分からず困っています。

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/09/09 13:21

A 回答 (4件)

NO.2です


ファイル四つに変数に入れていた内容をそれぞれ変更のたびに逐一保存すれば、少なくともオブジェクト変数にもクラス変数にもせずに済みます

大体どのように変更する感じか書いて見ました(全文の訂正ではないです)

class Bean implements Serializable{/**Bean側にSerializableインターフェースをimplementsしてprivate ArrayList<Bean> Data に入れていたオブジェクトをファイルに保存できるようにする*/

//内容
}


package database;
import java.io.*;//新しくimport
import java.io.Serializable;//新しくimport
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.sql.DataSource;
import Bean.Bean;
public class kadai7_database {

public String setSearchName(String searchName) {
//searchName.txtに値を書き込む
try(BufferedWriter bw=new BufferedWriter(new FileWriter("searchName.txt"))){
bw.write(searchName);
}catch(IOException e){
e.printStackTrace();}
return searchName; }

public String getSearchName() {//searchNameの値を返すメソッド
String s="";
//searchName.txtから値を読み込む
try(BufferedReader br=new BufferedReader(new FileReader("searchName.txt"))){
while((s=br.readLine())!=null){
}}catch(IOException e){
e.printStackTrace();}
return s; }

public String setSearchKind(String searchKind) {
// searchKind.txtに値を書き込む
try(BufferedWriter bw=new BufferedWriter(new FileWriter("searchKind.txt"))){
bw.write(searchKind);
}catch(IOException e){
e.printStackTrace();}
return searchKind;}

public String getSearchKind() {//searchKindの値を返すメソッド
String s="";
//searchKind.txtから値を読み込む
try(BufferedReader br=new BufferedReader(new FileReader("searchKind.txt"))){
while((s=br.readLine())!=null){}
}catch(IOException e){
e.printStackTrace();}
return s; }

public String setSearchCond(String searchCond) {//searchCond.txtに書き込むメソッド
//searchCond.txtに値を書き込む
try(BufferedWriter bw=new BufferedWriter(new FileWriter("searchCond.txt"))){bw.write(searchCond);
}catch(IOException e){
e.printStackTrace();}
return searchCond; }

public String getSearchCond() {//searchCondの値を返すメソッド
String s="";
//searchCond.txtから値を読み込む
try(BufferedReader br=new BufferedReader(new FileReader("searchCond.txt"))){
while((s=br.readLine())!=null){
}}catch(IOException e){
e.printStackTrace();}
return s; }

public ArrayList<Bean> getData() {
//Data.txtに入れたオブジェクトを読み取り返す
ArrayList<Bean> BD=new ArrayList<Bean>();
try(ObjectInputStream os=new ObjectInputStream(new FileInputStream("Data.txt"))){
BD=(ArrayList<Bean>)os.readObject();
}catch(ClassNotFoundException |IOException e){
e.printStackTrace();}
return BD;}

public String setSearchCond(){
switch(Integer.valueOf(getSearchKind())){//変数をメソッドに置き換えた
case 1:
setSearchCond(getSearchName() + "%");
break;
case 2:
setSearchCond("%" + getSearchName() + "%");
break;
case 3:
setSearchCond("%" + searchName);
break;
default:
setSearchCond(searchName + "%"); }
return getSearchCond;}

private ArrayList<Bean> getData(ResultSet rs) throws SQLException{ ArrayList<Bean> Data1=new ArrayList<Bean>();
while (rs.next()) {
Bean bean = new Bean();
bean.setName(rs.getString("name"));
bean.setPrice(rs.getString("price"));
Data1.add(bean); }
//オブジェクトを書き込む
try(ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream("Data.txt"))){
os.writeObject(Data1);
}catch(ClassNotFoundException |IOException e){
e.printStackTrace();
}
return Data1;
}}
    • good
    • 1

クラス変数? インタンス変数の間違いでしょうか?



で、

>private String searchName;
>private String searchKind;
>private String searchCond;
>private ArrayList<Bean> Data;

は、そもそも全然必要ないので無くしましょう。
レビューで全部書き直しになるレベルですね。

検索メソッドは文字列と一致場所の指定をパタメータで受け取り、
ローカル変数に検索条件文字列を作って検索しましょう。

検索結果をインスタンス内に格納するのは無意味。
検索用メソッドの戻りで返しましょう。
    • good
    • 1

「使用禁止に対処する方法」=kadai7_databaseのオブジェクトを作った時これら変数に直接アクセスできるようにする方法だったら



private String searchName;
private String searchKind;
private String searchCond;
private ArrayList<Bean> Data;


public String searchName;
public String searchKind;
public String searchCond;
public ArrayList<Bean> Data;
に書き換えるだけですが

もしそうでないのだとすると

クラス変数として使用せずに済ませたい

というのはローカル変数にしたいとかそういう意味なんでしょうか
この回答への補足あり
    • good
    • 1

1.findAll()、findByLikeName()の戻り値をArrayList<Bean>とし、


  return getData(rs);とする。
2.getData(ResultSet)内でthis.Dataにいちいち突っ込まない。
3.findByLikeName()の引数としてString searchName,
  int seachKindを用意して、呼出直後にsetSearchCond()と
  同等の処理をしてプレースホルダー値を取得する。

とかすればいいのでは。
findByLikeName()と言っているからには、LikeNameの値を
もって探すわけですから、その引数があってしかりだと思います。

直前の検索結果をクラスで保持する必要がないならthis.Dataも
わざわざ持つ必要ありません。
    • good
    • 1

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