初めまして、ブラザーと申します。
現在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.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;
}}
No.3
- 回答日時:
クラス変数? インタンス変数の間違いでしょうか?
で、
>private String searchName;
>private String searchKind;
>private String searchCond;
>private ArrayList<Bean> Data;
は、そもそも全然必要ないので無くしましょう。
レビューで全部書き直しになるレベルですね。
検索メソッドは文字列と一致場所の指定をパタメータで受け取り、
ローカル変数に検索条件文字列を作って検索しましょう。
検索結果をインスタンス内に格納するのは無意味。
検索用メソッドの戻りで返しましょう。
No.2
- 回答日時:
「使用禁止に対処する方法」=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;
に書き換えるだけですが
もしそうでないのだとすると
クラス変数として使用せずに済ませたい
というのはローカル変数にしたいとかそういう意味なんでしょうか
No.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も
わざわざ持つ必要ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Java java final 1 2022/06/10 22:49
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ボタンの複数割り当てについて
-
大量のデータを読み込んで表示...
-
C#でキーイベントが発生しない...
-
C#で、あるクラスのメンバーす...
-
Javaでタイマーの使い方
-
デスクトップマスコットのドラ...
-
Thread.sleepのInterruptedExce...
-
Java 他クラスの呼び出しが上手...
-
java のstruts1.3です。
-
C#でのWNetAddConnection3の使...
-
JavaFXでの表内のチェックボッ...
-
C# 矢印キーの取得
-
C#で別のFormへ複数の値を返そ...
-
System.out.printlnの意味がよ...
-
C言語のポインターに関する警告
-
ループ処理の際、最後だけ","を...
-
eclipseに記述したjavaファイル...
-
System.err. printlnとSystem.o...
-
ダブルクォーテーションを含む...
-
[JAVA]try 内の変数を外で!?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
Junitテストでvoid戻り値メッソ...
-
C#で、あるクラスのメンバーす...
-
C#でのWNetAddConnection3の使...
-
C# visibleプロパティをfalseに...
-
unityでのC++エラーの原因がわ...
-
ボタンの複数割り当てについて
-
C#で別のFormへ複数の値を返そ...
-
エンターキーを押すとOKボタン...
-
LVM_SETITEMSTATEでListViewの...
-
ユーザーコントロールを動的に...
-
[C#.net]スレッド化された別フ...
-
C# 矢印キーの取得
-
C#から、C++で作成したdll内の...
-
C# DataGridView列カスタマイズ
-
C#でキーイベントが発生しない...
-
Thread.sleepのInterruptedExce...
-
C#でのオブジェクトのコピーに...
-
C# 半角カナの文字化けについて
-
文字列の置換
おすすめ情報
>クラス変数として使用せずに済ませたい
>というのはローカル変数にしたいとかそういう意味なんでしょうか
はい、今のところローカル変数にして対処したいと思っているのですがそうする方法が分からず困っています。