Java入門・初心者質問スレ Part.8
■ このスレッドは過去ログ倉庫に格納されています
Java初心者のためのスレッドです。
※前スレ
Java入門・初心者質問スレ Part.7
http://mevius.5ch.net/test/read.cgi/tech/1515549964/
VIPQ2_EXTDAT: checked:vvvvvv:1000:512:----: EXT was configured >>715
\ 記号はエスケープ文字なので \\ にする。 ありがとうございます。
\\でもNG出て
if(a.matches(".*(.).*\\1.*")){
にさせてもらったら
期待通りの結果がでるようになりました。
ありがとうございました。 あー。そうか。matches() は前後に暗黙の ^$ が入るんだったな。 配列変数の宣言と配列を作成する文において、配列の型を2回記述しないと
いけない理由は何ですか?
例) int[] array = new int[5];
インスタンス変数の宣言文と似ていますが、もしかして配列においても
多態性が使えるんですか? bronzeの問題見てるけどインクリメントの後置やらfor文のブロック省略やら、引っ掻けたいだけの問題多すぎない? >>720
理由と言われても、そう言う言語仕様だから。もう20年以上前に設計された言語だから、今の基準で見たら冗長な表現が多々ある。
あと配列においても多態性が〜、の部分は何が言いたいのか分からない。 >>723
ありがとうございます。
その部分は勝手な憶測なので気にしないで下さい。
例えば、int型はdouble型に型変換されることもあり得るので、
例) double[] array2 = new int[5];
のような記述が出来るのかな?と思っただけです。 >>724
それは多態性というか暗黙的なキャストだな。
Javaではそれは出来ない。暗黙的キャストは便利なこともある反面、意図しないキャストでバグを生み出す可能性があるからJavaの設計思想とは相容れない。 >>724
子の型の代入を認めるのを共変というのだけれども
配列の型は共変だから型が継承関係にあるならば代入できるよ
Number[] a;
a = new Integer[5];
a = new Double[5]; >>722
まぁ自分が何気なく書いて意図した結果にならなくて混乱するようなことになるなよってことだと思う >>722
プログラミング言語の資格はそういうもの。
そもそもC言語の影響を受けた言語では細かい部分を知っていないと、他人が書いたコードが読めない。 >>725
ありがとうございます。
>>726
ありがとうございます。プリミティブ型は継承関係に無いから駄目ですね。 https://qiita.com/syu_chan_1005/items/46f94412f7493d6e60eb
このサイトに従ってBuild ArtifactsまでしてコマンドプロンプトでIdeaProjects\test\out\artifacts\test_jarから
「java test」
と実行したのですが
「エラー: メイン・クラスtestが見つからなかったかロードできませんでした」
と言われ実行できません。どのようにすればよろしいでしょうか。 >>730
自己解決しました。
.jarをjavaで走らそうとしたのが問題だったみたいで、
java -jar test.jarと入力したら無事出力されました。 スッキリわかるJava入門の第8章の練習問題を解き、以下のような
Clericクラスを作ったのですが、
https://pastebin.com/EZdvVESb
英語にすると訳が分からなくなる言葉もあったので、それらはローマ字に
した結果、英単語とローマ字が混在するコードになってしまったのですが、
問題でしょうか? >>733
自分1人しか弄らないなら好きにすればいいよ。
どうせならローマ字じゃなくて漢字や平仮名を使って日本語でそのまま命名することもできるから試してみるといい。
ただし一般論、というか仕事でやる開発なら英語で統一するのが普通なのでそれは忘れちゃいけない。 入門に出てくるようなクラス名は普通に出てくる単語ばっかだろうからさっさと覚えたほうがいいでしょ >>733
ソース見たけど、確かにkaifukuryoとか死ぬほど読みにくいから、これならいっそ「回復量」の日本語でもいいと思うw うちの社内システムは何年も前から部分的に日本語変数名も使ってるけど、特に問題が起きたことはないよ
ただこの話題で議論が紛糾して荒れるのをネットで見かけるから、何がなんでも絶対に許さない人達がいるのは間違いないw うちの会社でうっかりそんなことしたら中国語で溢れるよ。あとドイツ語と英語。
あ、英語はいいのかw 総称型配列を生成したい…リフレクション使えばいける? 答えてくれた方、ありがとうございました。
なるべく英語で行くようにしたいと思います。 ローマ字は特に気にしないけどおかしな英語だとモヤる
登録でregistってなんやねん >>739
Array.newInstanceの結果をダウンキャスト
警告が出るが気にしない
外から引数でClass<T>を受け取るようにすれば多少はタイプセーフ風な雰囲気を醸し出せるかもしれない
Javaのジェネリックがハリボテの糞と呼ばれる所以だ >>741
すまん。昔量産してしまった
区分フラグとかも >>743
まあモヤるレベルだから別にいいんだけどさ
終わりの見えない関数とか、読み解くと結局意味のない処理とか、Objectに全てを詰め込み中身を変えまくる黒魔術に比べたら可愛いもんさ、ハハハ…… Javaのジェネリクスが単なるObjectのシンタックスシュガーであることを考えると、
総称型の配列などというものは存在自体が常に虚偽であり明らかに矛盾していることがわかるだろう
Javaで総称型の配列が欲しいときは、ArrayList<>(これは実はObject[]をラップしている)を使うか、
単にObject[]を使っておいて辻褄合わせが必要なときに要素を適宜ダウンキャストしてやるかのどちらかだ
Javaのジェネリクスでは型の整合性を維持するのはジェネリックなメンバやクラスを作るプログラマの責任なんだよ
通常のアプリケーションコードで積極的に作るものではない silverの問題集の解説見ながら勉強してるけどコンスタントプールってのがあるんだなぁ(こなみかん) cyclopsを使ってダサいTRY-CATCHを改善してみたがカッコイイ
public static javafx.scene.image.Image loadImageFromFile(@NotNull Path path, double w, double h) {
return Try.withResources(() -> new FileInputStream(path.toFile()),
stream -> new javafx.scene.image.Image(stream, w, h, true, true),
IOException.class)
.onFail((e) -> GUICommon.debugMessage("loadImageFromFile >> File not found : " + path.toString()))
.get()
.orElse(null);
}
public static javafx.scene.image.Image loadImageFromURL(@NotNull URL url, double w, double h) {
return Try.withCatch(url::openConnection)
.peek(conn -> conn.setRequestProperty("User-Agent", "Wget/1.13.4 (linux-gnu)"))
.peek(conn -> conn.setRequestProperty("Referer", customReferrer(url, null)))
.flatMap(conn -> Try.withResources(conn::getInputStream,
stream -> new javafx.scene.image.Image(stream, w, h, true, true),
IOException.class))
.onFail((e) -> GUICommon.debugMessage("loadImageFromURL >> Cannot get image from : " + url.toString()))
.get()
.orElse(null);
} clone()メソッドについて質問です。
https://pastebin.com/iabGmAun
上記のBookクラスにおいて、フィールドに、Date型のpublishDateがあるのですが、
これをclone()でコピーするにあたっては深いコピーにする必要があるみたいなのですが、
String型は浅いコピーでよくてDate型は深いコピーにしないといけない理由は
何故でしょうか? >>748
Date型は状態を変えられるから
たとえば単純にコピーするだけだと
こうなる
Book ┬ Date ─ 2018/12/01
Book ┘
Date.setTimeで状態を変えることができて
コピー先のBookの日付を変えると
コピー元のBookの日付も変わる
Bookごとに日付が異なるなら
BookをコピーするときにDateをコピーしないといけない
Stringは状態を変えられないから
同じものを参照しても問題ない 何でもいいから例外をなげたいんですけど
例外で調べても catch のサンプルばかりで投げ方がわかりません >>751
throw new Exception("テスト");
これでおk >>752
new でふつうにclassみたいに作れるんですね
ありがとうございました 基礎からのサーブレット Servlet/jsp 2009
この本で勉強するのは古すぎか? >>753
みたいにっていうか、クラスだから。
Exceptionを継承して独自の例外クラスも作れる。 >>754
古すぎる。古文書レベル。
役に立たないどころか現代ではやってはいけないとされてるやり方が載ってる可能性もあるから、それを覚えてしまってむしろマイナスになるまであり得る。 列挙型のフィールドを持つクラスを作ったのですが……
同じ列挙型を2つ持たせる場合があるものの、1つのみ持つ場合もあることで問題が発生しています
コンストラクタ引数で列挙型指定する際に、必ず1つ指定するが、2つ目は(言うなら)nullでも構わない
列挙型の中にnull相当のものを追加してもよいと思ったのですが、それが1つ目に指定されてしまうと困るので追加したくない……という状態です
具体的には、いくつかの属性を列挙型で指定し、サブ属性は(同じ内容+(サブ属性なし))というかたちにしたいのです
サブ属性用に(同じ内容+なし)の列挙型を追加するしかないでしょうか…… >>754
つか、古すぎてその本に書いてあるバージョンの開発環境を用意する時点で挫折すると思う。 >>759
そうか、1つ目にnull入れられないようにチェック入れりゃよかったんですね
エラーを使う発想がなかった >>758
どういう状況なのかよくわからない。
同じメソッド名で一つの引数のやつと二つの引数のやつ作れば良いだけってことない?
つまりメソッドのオーバーロード。 >>762
それだと後々面倒だという理由があったような気がするんだけどむしろ後々表示するときに処理考えたほうが簡単に済みそうな気もしてきました……
こういう設計?ってどういう順番でやってくもんなんでしょうか データを呼び出して表示する目的だったので、とりあえずtoStringのオーバーライドができてからデータ登録用のコンストラクタを調整していくことにしました 拡張for文って配列でもコレクションでも動作しますよね?
ということは、双方に共通するクラスなりインターフェースなりがあるのでしょうか?
配列またはコレクションを引数に取る関数を作りたくて、内部処理は同じなので、オーバーロードではなく一つの関数で済ませたいのですが >>765
共通のインターフェースは存在しないです
コンパイラがIterableか配列か判断して処理します
オーバーロードを使いましょう >>766
ありがとうございます
それともう一つ質問させてください
リストを引数に取ってリストを返す関数で、よく
public <T> List<T> hoge(List<T> list){
// 何らかの処理
}
のように書きますが、この引数のリストがArrayListならArrayListを、LinkedListならLinkedListを、といったように、引数と同じ型のインスタンスを返したいです
ポリモーフィズムというよりは型クラスのイメージです
境界化して
public <A extends List<T>, T> A<T> piyo(A<T> list){}
のように書いてみましたが、「型Aは総称ではありません」とエラーになりました。
ワイルドカードなどを使えばいいのでしょうか?
というかあまりJava的な書き方ではないですかね? >>767
引数の型と戻り値の型をAにすればいんじゃないでしょうか
私はそういうの必要になったことがないです
List返すぜヒャッハーなコードしか書いたことないです
Javaでそういうの書きまくってる世紀末ジェネリック伝説
みたいな人もいると思いますけど >>768
何度もありがとうございます
混乱させるのも嫌なので普通の書き方に準拠します
Javaは慣れてないので勉強します >>767
LinkedListってArrayListやListと用途が違う気が。。。
素直に?オーバーロードで良いんじゃ無いか?
多態性はジェネリックだけにあらずよ?
(と言うか、Java初期にはジェネリック無かったし) >>770
Listの汎用関数とか、Mapの汎用関数を作ってたら思った次第です
Mapなら、HashMapはHashMap、EnumMapはEnumMapで返したいなとかです
素直にオーバーロードしますね
ありがとうございました それって呼び出す側にnewさせて引数で受け取れば良いだけでは?
自分でnewしてリターン値にしないなら関係なくなるよね。 素朴な疑問なのですが
Javaプログラマーってみんなオブジェクト指向やデザインパターンやイベントリスナーのしくみなんかを完璧に理解して使いこなせているんですか?
別に自慢じゃないけどオレは理系で高学歴ですが
こんな難解複雑なものをみんなたやすく理解できるものじゃないと思うのですが。
高校の数学物理化学をレベルの高い大学に受かるくらいの頭がないと無理と感じます。 デザインパターンは、オブジェクト同士の疎結合の歴史。
DI, Flux, Pub-Sub(発行・購読)とか
WEB+DB 106号に載ってる。
スマホアプリの設計。DI, MVVM, Flux >>772
出来るだけ副作用のない関数にしたかったので、その手は見送りました >>773
容易くかどうかはわからんが、ずっとやってりゃ小学生でもわかるようになると思うけどな。
このスレにもいないか?小学生の頃からプログラミングたできたやつ。 >>774
>>776
なるほど。
まあワタシは頭がいいのですぐ理解して使いこなせそうですが。
ハッハッハ!
ところでスキルを身に着けたときやっぱり報酬は期待したいのですが
年収1000万以上、できるだけ高く、を目指すためには、どのようなことをすればいいですか?
これはヒューマンスキルも大きくかかってくると思いますが、具体的にどんなことをすれば高収入になりますか?
野球でも年俸はFAがからむと高収入になるし、それがないと成績がいいのに低収入の選手もいるし、
なにかコツを知ってるだけで同じスキルなのに収入は天と地ほどの大差になるというのが現状のような気がして。 そういう事を聞かなくても行動できるのが、高収入な人だと思うけど。 >>773
ちゃんと理解出来ている人は極少数だと思う
でも理解出来てなくてもある程度実装は出来てしまうしプログラマにも成れてしまうからどヤバいコードが生成されてしまったりするわけで >>781
なるほどそうなのですね。納得。
オレはわりと進学校出身だけど、まわりはみんな数学物理化学で苦労しててオレだけできたから
プログラマの仕事でもそう簡単にオブジェクト指向/デザインパターン/イベントリスナーを理解できる人はいない気はしていました。
でもこれに甘えずオレはどんどん勉強してスキルアップしていきたいと思います。
オレは経験がないだけど伸びしろは無限にあると思っているので。
オレみたいな人がやっぱりプログラミングに向いてるよね?w
高校レベルの数学物理化学で苦労するようじゃプログラミングも高度なことは絶対できなそうだし。 >>782
傲慢であることはいわゆるプログラマーの三大美徳の1つなので安心して励んでください いや、使われる能力がちょっと違うと思うぞ。
数学や物理が絡まなくはないし絡められるわけだが、かといってそんなもんほとんど知らないままプログラミングできるようになるやつは居るだろうしな。 >>782
数物化が出来る→プログラミングが出来る
は一般に成り立たないかな
情報系でそれなりに良い成績を獲ってるけど実技系の科目の成績は低いみたいな人は結構いたりするし情報系であってもちゃんと理解出来てる人はそんなに多くない
まぁ相関が全く無いとは思わないけどね >>785
そこらへんは知識そのものというより、求められる思考方法が近しいってのはある。
だから数学が出来ればプログラミングが出来るっていうより、数学の得意なタイプのやつはプログラミングも得意であることが多い、とかそういう感じだと思う Windows10のJava1.8以上のバージョンのSwingでの日本語入力する時、
編集中の行が画面の一番下の方の時に変換すると、日本語変換候補Windowが編集中の行と重なって、編集中の文字列を隠してしまうバグのようなものが
自分の環境ではおきるのですが、他の人はどうですか?
Swingのテキストコンポーネントでおきます。 >>788
ありがとう。
これだけ普通の条件で簡単に起きるのに、ずっとバグが直らないのはSwingで日本語入力なんてほとんど使われてないからなんだろうな。
Intellijとか使われてるけど、プログラム用のエディタだから日本語はほとんど入力されないのかな。
バグレポートかなんかしたいと思ったけど、ます英語を勉強しなきゃいけないし。 編集中の行の下に候補ウィンドウを表示する時はうまくいくんだけど、
編集中の上に候補ウィンドウを表示する時(つまり編集中の行が画面の下の方の時)、重なってしまう。
IMEのAPIのバグらしく、Swing使ってる限り独自のテキストコンポーネントを作っても直らない。 3つ組の値を返したいときってそれ用のクラス作った方がいいの?
それとも汎用的なタプル的なの作ってそっちに詰め込んだ方がいい?
クラスにしたとして、他の箇所で使うかは微妙なところ
もしかしたらもう一回くらい使うかもってくらい >>791
配列やリスト等に突っ込んで返す方法もあるが、本当にそれで問題ないかはよく考えた方が良いと思う。 >>791
Hashmapに突っ込むとかもある。
俺なら絶対にクラスを作るけど。 Ruby なら、メソッドの委譲機能を定義する、forwardable, delegate
継承(is-a)じゃなくて、汎用的なコンテナ(配列・リスト・辞書)に処理を委譲するような形(has-a)
クラス内に、汎用的なコンテナを作って、
push, pop など、同じメソッド名で、処理を内部コンテナに丸投げする VBAは経験豊富だけどJavaは初めてです。
もちろんいっぱい勉強しました。
転職アピールで取ったほうがいい資格はなにがありますでしょうか?
Java経験ないので面接の質疑応答と資格アピールでがんばろうと思うのですが。
資格受験はすぐに取り掛かる予定です。今月にでも! earとかwarがいまいちわからないです
開発時にファイルAでファイルB(別パッケージ)をimportして使っていて、eclipse上ではコンパイルも通っていました
でもデプロイ段階になってから、先輩にこの2つのパッケージは別々のwar?になるからimportできないよと言われました
自分の感覚だとそもそもそれでコンパイルが通るようになってるのがおかしい気がするのですが、Javaの世界だとそれが普通なんですか? earは耳、warは戦争です。
発音の注意としては、warは「ウォー」であって「ウァー」ではありません。
ここを押さえておけば大丈夫。 >>796
それはear、war云々の話ではなく
開発段階とデプロイ段階で違うことをやってるのがおかしいという話では? >>799
あ、それです
ただJava界隈だとそれが普通なのかなと思いまして ear, war, tar など、ar とついているものは、zip などの圧縮 archive だろ。
サーバーにデプロイするために、1つにまとめる
だから、a.ear の中から、b.war の中の、オブジェクト・関数などは使えないのだろう
2つもデプロイしないから。
デプロイするのは、1つだけ
「java ear war」で検索! tarは頭からファイル名、内容の順で入ってるだけだからいまいち使い辛いな。
ファイル名出したいだけでも途中に大きいファイルがあると待たされる。
テープ装置用のコマンドを無理矢理使い回してるのがいかんよな。
せめてファイル名だけ並べたヘッダだけでも別に用意すればいいのに。 >>804
テープ用のコマンドを無理矢理使いまわしてるんじゃなくて、今でもテープに書いたりもするぞ。-Mでマルチボリュームにして、-Lでサイズ指定したらテープ交換メッセージ出る。
そうしとかないとボリュームまたぎのファイル探しづらいし、そういうもんじゃねえかなぁ。
ディスクに落とすとしても、ボリューム切り替わるたびに最初のディスク入れさせるとか狂気の沙汰な気がする。 まあ今でもテープ装置があれば使うのはわかる。
しかしテープではなく普通のファイルに書くならもう一ひねり欲しいところ。 silver黒本で勉強してて、例外終わらせたと思ったら最終章でラムダ式とかいう完全に新しいやつでてきてわろた
仕様が覚えられん ラムダなんか平均的なJava土方現場ならもれなく使用禁止だから安心していい
その証拠にこのスレでも滅多に出てこないだろ? そうなのか、まあ試験用で一通り覚えないといけないけど
考え方とか他の言語やるときに役立つかな Javaのラムダはコンビネータを記述できますか?出来ないのなら不要(ラムダの意味がない)と思います ラムダっていうか関数型の概念をJavaを通じて学ぶのは無謀だから試験用に割り切るしかない >>810
は?
import java.util.function.Supplier;
public class Test {
public static void main(String[] args) {
バニーガール a = new バニーガール(() -> "巨乳");
a.ぱふぱふ();
}
}
class バニーガール {
Supplier<String> create;
バニーガール(Supplier<String> create) {
this.create = create;
}
void ぱふぱふ() {
String おっぱい = create.get();
System.out.printf("%sでぱふぱふ", おっぱい);
}
} >>812-813
は?
それのどこがコンビネータですか? >>814
コンビネータとは関係なくラムダ式は便利だよ
コンビネータ仕事で使うことないやろ
それを言うとんねん ■ このスレッドは過去ログ倉庫に格納されています