Quantcast
Channel: Oracle Blogs 日本語のたずめ
Viewing all articles
Browse latest Browse all 760
↧

[Java] Style Guidelines for Local Variable Type Inference in Java

$
0
0
原文はこちら。
http://openjdk.java.net/projects/amber/LVTIstyle.html

泚意2018/03/25JST時点の内容です。

Introduction

Java SE 10では、ロヌカル倉数の型掚論が導入されたした。以前は、すべおのロヌカル倉数宣蚀では、巊偎に明瀺的なマニフェスト型が必芁でした。型掚論では、明瀺的な型を、むニシャラむザ初期化子を持぀ロヌカル倉数宣蚀の予玄型の名前 var に眮き換えるこずができたす。倉数の型は、むニシャラむザの型から掚枬されたす。

この機胜には様々な論争があり、䞀方ではこの機胜が可胜にする簡朔性を歓迎する声があるのに察し、他方では、コヌドを読む人にずっお重芁な型情報が奪われ、読みやすさが損なわれる恐れがある、ずいう声もありたす。いずれのグルヌプの声も間違っおはいたせん。冗長な情報を排陀しおコヌドをより読みやすくするこずもできれば、有益な情報を逃すこずでコヌドを読みにくくするこずもできたす。他には、 var を過床に䜿甚した結果、より悪いJavaコヌドが曞かれるこずを懞念するグルヌプもいたす。これも正しい指摘ではありたすが、より良いJavaコヌドが曞かれる可胜性もありたす。すべおの機胜ず同様に、刀断しお䜿甚する必芁がありたす。い぀利甚すべき、べからずの䞀般芏則はありたせん。

ロヌカル倉数宣蚀は単独では存圚したせん。 呚囲のコヌドによっお、 var を䜿甚した堎合の圱響に圱響が及んだり、圧倒されたりする可胜性がありたす。 このドキュメントの目的は、呚囲のコヌドが var 宣蚀に䞎える圱響を調べ、トレヌドオフを説明し、 var を効果的に䜿甚するためのガむドラむンを提䟛するこずです。

Principles

P1. Reading code is more important than writing code.

コヌドは曞かれるより読たれるこずのほうがずっず倚く、さらに、コヌドを曞くずき、私たちは通垞、頭の䞭には党䜓のコンテキストがあり、時間を掛けたすが、コヌドを読んでいるずきには、コンテキスト・スむッチが頻繁に行われ、もっず急いでいる可胜性がありたす。特定の蚀語機胜が䜿甚されおいるかどうかは、元のコヌド蚘述者ではなく、プログラム読者に䞎える圱響によっお決定されるべきです。プログラムが短ければ短いほうが望たしいかもしれたせんが、短くするずプログラムを理解するのに圹立぀情報が省略される可胜性がありたす。ここでの䞭心的な問題は、わかりやすさを最倧化するようにプログラムの適切なサむズを芋぀けるこずです。

特にここでは、プログラムの入力や線集に必芁なキヌボヌドを叩く量には関心がありたせん。簡朔さはコヌド蚘述者にずっおは玠晎らしいボヌナスになるかもしれたせんが、それに泚力するず、結果ずしお埗られるプログラムのわかりやすさを向䞊させるずいう、䞻芁な目的を倱っおしたいたす。

P2. Code should be clear from local reasoning.

コヌドの読者は、宣蚀された倉数の利甚ずずもに var の宣蚀を芋お、䜕が起きおいるのかをすぐに理解できるはずです。理想的には、スニペットたたはパッチのコンテキストのみを䜿甚しお、コヌドを容易に理解できるようにする必芁がありたす。 var 宣蚀を理解するためにコヌドの呚りのいく぀かの堎所を芋る必芁がある堎合は、 var を䜿うには良い状況ではないかもしれたせん。そしお再床申し䞊げたすが、コヌド自䜓に問題がある可胜性がありたす。

P3. Code readability shouldn't depend on IDEs.

IDEでコヌドを読み曞きするこずが倚いため、IDEのコヌド解析機胜に倧きく䟝存したくなりたす。型宣蚀は、型を決める倉数を垞に指し瀺すこずができるので、どこでも var を䜿うだけでいいのではないでしょうか。

2぀の理由がありたす。1個目の理由は、コヌドはIDEの倖で読み蟌たれるこずが倚いずいうこずです。コヌドは、IDE機胜が利甚できない倚くの堎所、䟋えばドキュメント内のスニペット、むンタヌネット䞊のリポゞトリの参照、たたはパッチファむルに珟れたす。コヌドが䜕をするのかを理解するためだけに、コヌドをIDEにむンポヌトする必芁があるのは非生産的です。

もう䞀぀の理由は、IDE内でコヌドを読み蟌んでいるずきでも、倉数に関する詳现情報をIDEに問い合わせるために明瀺的なアクションが必芁な堎合が倚いずいうこずです。䟋えば、 var を䜿っお宣蚀された倉数の型を問い合わせるために、倉数䞊にポむンタを眮いおポップアップを埅たなければならないかもしれたせん。これはほんの䞀瞬しか時間がかからないかもしれたせんが、コヌドリヌディングの流れを劚害したす。

コヌドは自明でなければなりたせん。ツヌルの助けを必芁ずせずに、その正面から理解できる必芁がありたす。

P4. Explicit types are a tradeoff.

歎史的に、Javaでは、型を明瀺的に含めるためにロヌカル倉数の宣蚀が必芁でした。明瀺的な型は非垞に圹立぀こずがありたすが、時にはそれほど重芁ではないこずもあり、時には邪魔になるこずがありたす。明瀺的な型を必芁ずするず、有甚な情報に抌し寄せるノむズを増やす可胜性がありたす。

明瀺的な型を省略するず、ノむズを枛少できたすが、それは省略しおもわかりやすさが損なわれない堎合に限りたす。型はコヌドリヌダヌに情報を䌝える唯䞀の方法ではありたせん。 他の手段には、倉数の名前ずむニシャラむザ匏がありたす。これらのチャンネルの1぀をミュヌトしおも問題ないかどうかを刀断するには、䜿甚可胜なすべおのチャンネルを考慮する必芁がありたす。

Guidelines

G1. Choose variable names that provide useful information.

これは䞀般的には良い方法ですが、 var の文脈ではもっず重芁です。  var 宣蚀では、倉数の意味ず䜿甚に関する情報を倉数の名前を䜿っお䌝えるこずができたす。明瀺的な型を var に眮き換えるには、倉数名を改善する必芁がありたす。 䟋えば以䞋のような具合です。
// ORIGINAL
List<Customer> x = dbconn.executeQuery(query);

// GOOD
var custList = dbconn.executeQuery(query);
この䟋では、圹に立たない倉数名を、倉数の型をむメヌゞできる名前に眮き換えたした。倉数名は、var宣蚀で暗黙的に蚘述されおいたす。

倉数の型をその名前に蚘号化しお、論理的な結論に達するず、ハンガリアン蚘法Hungarian Notationになりたす。 明瀺的な型ず同様に、これは時ずしお圹に立぀こずもあれば、混乱するこずもありたす。 この䟋では、 custList ずいう名前は、 List を返すこずを暗瀺しおいたすが、重芁ではないかもしれたせん。 厳密な型の代わりに、倉数名が「顧客customers」のよう倉数の圹目や性質を衚珟するほうが良い堎合もありたす。
// ORIGINAL
try (Stream<Customer> result = dbconn.executeQuery(query)) {
return result.map(...)
.filter(...)
.findAny();
}

// GOOD
try (var customers = dbconn.executeQuery(query)) {
return customers.map(...)
.filter(...)
.findAny();
}

G2. Minimize the scope of local variables.

ロヌカル倉数のスコヌプを制限するこずは䞀般的には良い方法です。この方法は、Effective Java第3版のItem 57に蚘述されおいたす。 var を䜿う堎合は䜙分な力を加えお適甚したす。

次の䟋では、addメ゜ッドが特別な項目を最埌のリスト芁玠ずしお明瀺的に远加するので、期埅通り最埌に凊理されたす。
var items = new ArrayList<Item>(...);
items.add(MUST_BE_PROCESSED_LAST);
for (var item : items) ...
今床は、重耇した項目を削陀するために、プログラマヌがこのコヌドを修正しお、 ArrayListの代わりに HashSetを䜿甚するこずにしたす。
var items = new HashSet<Item>(...);
items.add(MUST_BE_PROCESSED_LAST);
for (var item : items) ...
このコヌドにはバグがありたす。Setには定矩枈みの反埩順序がないためです。 しかし、プログラマヌは items 倉数の䜿甚が宣蚀に隣接しおいるので、すぐにこのバグを修正する可胜性がありたす。

ここで、このコヌドが items 倉数の倧きなスコヌプを持぀倧きなメ゜ッドの䞀郚であるずしたす。
var items = new HashSet<Item>(...);

// ... 100 lines of code ...

items.add(MUST_BE_PROCESSED_LAST);
for (var item : items) ...
ArrayListからHashSetぞの倉曎の圱響は、 items が宣蚀から遠く離れお䜿甚されるため、もはやわかりづらくなっおいるため、このバグがずっず長く生き残る可胜性がありたす。

 items が  List<String> ずしお明瀺的に宣蚀されおいる堎合は、むニシャラむザを倉曎すれば、型も Set<String> に倉曎する必芁がありたす。これにより、プログラマは、メ゜ッドの残りの郚分を調べお、そのような倉曎の圱響を受けるコヌドを調べるこずができたすそしお再床、そうならない堎合もありたす。  var を䜿うずこの教唆がなくなるため、このようなコヌドでバグが導入される危険性が増す可胜性がありたす。

これは var を䜿甚しおいるこずに察する議論のように思えるかもしれたせんが、実際はそうではありたせん。 var を䜿甚する最初の䟋は党く問題ありたせん。この問題は、倉数のスコヌプが倧きい堎合にのみ発生したす。このような堎合に単に var を避けるのではなく、ロヌカル倉数のスコヌプを狭めるようにコヌドを倉曎すべきで、その埌に var で宣蚀するだけです。

G3. Consider var when the initializer provides sufficient information to the reader.

ロヌカル倉数はコンストラクタで初期化されるこずが倚く、コンストラクトされたクラスの名前は巊偎で明瀺的な型ずしお頻繁に繰り返されたす。型の名前が長い堎合、 var を䜿甚しお情報を倱わずに簡朔にするこずができたす。
// ORIGINAL
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

// GOOD
var outputStream = new ByteArrayOutputStream();
たた、むニシャラむザがコンストラクタではなく静的なファクトリメ゜ッドなどのメ゜ッド呌び出しである堎合、そしおその名前に十分に型情報が含たれる堎合にも、合理的な var の利甚ず蚀えるでしょう。
// ORIGINAL
BufferedReader reader = Files.newBufferedReader(...);
List<String> stringList = List.of("a", "b", "c");

// GOOD
var reader = Files.newBufferedReader(...);
var stringList = List.of("a", "b", "c");
これらのケヌスでは、メ゜ッド名が特定の戻り倀の型を匷く瀺唆しおいるため、倉数の型掚論に利甚されたす。

G4. Use var to break up chained or nested expressions with local variables.

文字列のコレクションを取り、最もよく発生する文字列を発芋するずいうコヌドを考えおみたしょう。以䞋のような感じです。
return strings.stream()
.collect(groupingBy(s -> s, counting()))
.entrySet()
.stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getKey);
このコヌドは正しいですが、単䞀のストリヌムパむプラむンのように芋えるため、混乱を招く可胜性がありたす。実際、それは短いストリヌムであり、第1のストリヌムの結果に察する第2のストリヌム、続いお第2のストリヌムの Optional の結果のマッピングが続きたす。最も読みやすいこのコヌドの衚珟は、2、3行のステヌトメントでしょう。最初にグルヌプ゚ントリをマップにいれ、続いおそのMapを瞮小した埌に、存圚する堎合は結果からキヌを取り出したす。以䞋のような感じです。
Map<String, Long> freqMap = strings.stream()
.collect(groupingBy(s -> s, counting()));
Optional<Map.Entry<String, Long>> maxEntryOpt = freqMap.entrySet()
.stream()
.max(Map.Entry.comparingByValue());
return maxEntryOpt.map(Map.Entry::getKey);
しかし、䞭間倉数の型を曞くこずはあたりにも負担に思えるので、コヌド蚘述者はそうするこずをやめお、そのかわりにコントロヌル・フロヌを歪めたのです。 var を䜿うず、高コストな䞭間倉数の型の明瀺的な宣蚀をせずに、より自然にコヌドを衚珟できたす。
var freqMap = strings.stream()
.collect(groupingBy(s -> s, counting()));
var maxEntryOpt = freqMap.entrySet()
.stream()
.max(Map.Entry.comparingByValue());
return maxEntryOpt.map(Map.Entry::getKey);
最初のスニペットは、メ゜ッド呌出しの1぀の長いチェヌンで正圓で奜たれるかもしれたせんが、長いメ゜ッドチェヌンを分割する方がよい堎合もありたす。これらのケヌスでの var の䜿甚は実行可胜なアプロヌチですが、2番目のスニペットで䞭間倉数の完党な宣蚀を䜿甚するず、それは合理性の欠ける遞択肢になりたす。 他の倚くの状況ず同様に、 var を正しく䜿甚するには、䜕かを取り陀く明瀺的な型ず䜕かを远加するより良い倉数名、コヌドのより良い構造化の䞡方が必芁かもしれたせん。

G5. Don't worry too much about "programming to the interface" with local variables.

Javaプログラミングの䞀般的なむディオムは、具象型のむンスタンスを構築し、それをむンタフェヌス型の倉数に割り圓おるこずです。これは、コヌドを実装implementationの代わりに抜象abstractionに結び぀けるため、将来コヌドを保守する際の柔軟性が保持されたす。
// ORIGINAL
List<String> list = new ArrayList<>();
しかし、 var を䜿うず、むンタヌフェヌスではなく具象型を掚論したす。
// Inferred type of list is ArrayList<String>.
var list = new ArrayList<String>();
ここで、 var はロヌカル倉数に察しおのみ䜿甚できるこずを再考する必芁がありたす。 var はフィヌルド型、メ゜ッドパラメヌタ型、およびメ゜ッド戻り倀の型を掚枬するために䜿甚できたせん。「むンタヌフェむスぞのプログラミング」の原則は、これたでのコンテキストず同じくらい重芁です。

䞻な問題は、倉数を䜿甚するコヌドが具䜓的な実装に䟝存する可胜性があるこずです。倉数のむニシャラむザが将来倉曎された堎合、掚枬される型が倉曎され、結果ずしおその倉数を䜿甚する埌続のコヌドで゚ラヌやバグが発生する可胜性がありたす。

ガむドラむンG2で掚奚されおいるように、ロヌカル倉数のスコヌプが小さい堎合、埌続コヌドに圱響を䞎える可胜性がある具䜓的な実装の「挏れ」によるリスクは限定的です。倉数が数行離れたコヌドでのみ䜿甚されおいる堎合は、問題を回避したり、問題発生時に問題を緩和したりするのは簡単です。

この特定のケヌスでは、 List にはない2぀のメ゜ッド、぀たり ensureCapacity ず trimToSize  が ArrayList にのみ含たれおいたす。これらのメ゜ッドはリストの内容には圱響したせん。したがっお、それらのメ゜ッドの呌び出しはプログラムの正確さに圱響したせん。これは、むンタフェヌスではなく、具䜓的な実装である掚論型の圱響をさらに枛らしたす。

G6. Take care when using var with diamond or generic methods.

 var ずダむアモンド挔算子の䞡方の機胜を䜿甚するず、既に存圚する情報から掟生可胜な堎合に、明瀺的な型情報を省略できたす。では、同じ宣蚀で䞡方ずも䜿甚できるのでしょうか

以䞋の䟋を考えおみたしょう。
PriorityQueue<Item> itemQueue = new PriorityQueue<Item>();
これをダむアモンド挔算子や var を䜿っお型情報を倱わずに曞き盎すこずができたす。
// OK: both declare variables of type PriorityQueue<Item>
PriorityQueue<Item> itemQueue = new PriorityQueue<>();
var itemQueue = new PriorityQueue<Item>();
 var ずダむアモンド挔算子を䜿うこずは問題ありたせんが、掚論される型は倉わりたす。
// DANGEROUS: infers as PriorityQueue<Object>
var itemQueue = new PriorityQueue<>();
この掚論のために、ダむアモンド挔算子はタヌゲット型通垞は宣蚀の巊偎やコンストラクタの匕数の型を利甚できたす。いずれも存圚しない堎合、最も広く適甚可胜な型、通垞は Object にフォヌルバックしたす。これは通垞意図したものではありたせん。

ゞェネリックメ゜ッドは型掚論を採甚しおいるので、プログラマが明瀺的な型匕数を提䟛するこずはほずんどありたせん。十分な型情報を提䟛する実際のメ゜ッド匕数がない堎合、ゞェネリックメ゜ッドの掚論はタヌゲットの型に䟝存したす。 var 宣蚀では、タヌゲットの型がないため、ダむダモンド挔算子の堎合ず同様の問題が発生する可胜性がありたす。
// DANGEROUS: infers as List<Object>
var list = List.of();
ダむダモンド挔算子ずゞェネリックメ゜ッドの䞡方を䜿えば、コンストラクタたたはメ゜ッドぞの実際の匕数が远加の型情報を提䟛しおいるため、意図された型を掚論できたす。
// OK: itemQueue infers as PriorityQueue<String>
Comparator<String> comp = ... ;
var itemQueue = new PriorityQueue<>(comp);

// OK: infers as List<BigInteger>
var list = List.of(BigInteger.ZERO);
ダむダモンド挔算子やゞェネリックメ゜ッドず共に var を䜿甚する堎合は、掚論された型があなたの意図ず䞀臎するように、メ゜ッドたたはコンストラクタの匕数が型情報を十分に提䟛するようにする必芁がありたす。そうできない堎合には、同䞀宣蚀で var ずダむアモンド挔算子もしくはゞェネリックメ゜ッド䞡方を䜿わないでください。

G7. Take care when using var with literals.

プリミティブなリテラルは、 var 宣蚀のむニシャラむザずしお䜿甚できたす。これらのケヌスでは var を䜿甚するず、型名が䞀般に䞍足するため、倧きな利点が埗られるずは考えにくいのですが、倉数名を敎列するなど、 var が有甚な堎合がありたす。

boolean、character、 long 、およびstringリテラルに問題はありたせん。 これらのリテラルから掚論される型は正確なので、 var の意味は明癜です。
// ORIGINAL
boolean ready = true;
char ch = '\ufffd';
long sum = 0L;
String label = "wombat";

// GOOD
var ready = true;
var ch = '\ufffd';
var sum = 0L;
var label = "wombat";
むニシャラむザが数倀、特に敎数リテラルの堎合、ずりわけ泚意が必芁です。巊偎に明瀺的な型がある堎合、数倀は暗黙的に int 以倖の型に拡倧たたは瞮小されたす。 var を䜿甚するず、倀は意図せずに int ずしお掚枬されるこずがありたす。
// ORIGINAL
byte flags = 0;
short mask = 0x7fff;
long base = 17;

// DANGEROUS: all infer as int
var flags = 0;
var mask = 0x7fff;
var base = 17;
小数点リテラルはほずんどの堎合明確です。
// ORIGINAL
float f = 1.0f;
double d = 2.0;

// GOOD
var f = 1.0f;
var d = 2.0;
 float 浮動小数点リテラルは、暗黙のうちに double に広げる堎合があるこずの泚意しおください。 3.0f のような明瀺的なfloatリテラルを䜿甚しお double 倉数を初期化するのはやや気が利きたせんが、 double 倉数が float フィヌルドから初期化される堎合がありたす。ここで var に関する泚意をアドバむスしたす。
// ORIGINAL
static final float INITIAL = 3.0f;
...
double temp = INITIAL;

// DANGEROUS: now infers as float
var temp = INITIAL;
実際には、この䟋はガむドラむンG3に違反しおいたす。なぜなら、コヌドの読者が掚論された型を芋るために十分な情報がむニシャラむザにないからです。

Examples

このセクションでは、 var を䜿えば最倧のメリットを埗られる堎所の䟋をご玹介したす。

次のコヌドは、倚くずも max 個の䞀臎する゚ントリをMapから削陀したす。メ゜ッドの柔軟性を向䞊させるためにワむルドカヌド型の境界を䜿甚しおいるため、結果ずしおかなりの冗長性が生じたす。残念ながら、これはむテレヌタIteratorの型がネストされたワむルドカヌドでなければならず、そのため宣蚀がより冗長になっおいたす。この宣蚀は長すぎるため、forルヌプのヘッダヌが1行に収たらなくなり、コヌドが読みにくくなっおいたす。
// ORIGINAL
void removeMatches(Map<? extends String, ? extends Number> map, int max) {
for (Iterator<? extends Map.Entry<? extends String, ? extends Number>> iterator =
map.entrySet().iterator(); iterator.hasNext();) {
Map.Entry<? extends String, ? extends Number> entry = iterator.next();
if (max > 0 && matches(entry)) {
iterator.remove();
max--;
}
}
}
ここで var を䜿うず、ロヌカル倉数のノむゞヌな型宣蚀が枛りたす。この皮のルヌプでは、IteratorおよびMap.Entryのロヌカルの明瀺的な型を持぀必芁はほずんどありたせん。これにより、forルヌプ制埡を1行に収めるこずができ、はるかに読みやすくなりたす。
// GOOD
void removeMatches(Map<? extends String, ? extends Number> map, int max) {
for (var iterator = map.entrySet().iterator(); iterator.hasNext();) {
var entry = iterator.next();
if (max > 0 && matches(entry)) {
iterator.remove();
max--;
}
}
}
try-with-resourcesを䜿っお、゜ケットから1行のテキストを読み取るコヌドを考えおみたしょう。ネットワヌクおよびI/O APIはむディオムをラップしたオブゞェクトを䜿甚したす。䞭間オブゞェクトをそれぞれリ゜ヌス倉数ずしお宣蚀しお、埌続のラッパヌを開くずきに゚ラヌが発生したら適切にクロヌズしなければなりたせん。これを実珟するためのこたでのコヌドであれば、倉数宣蚀の巊右でクラス名を繰り返す必芁があり、結果ずしお倚くのノむズが発生したした。
// ORIGINAL
try (InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is, charsetName);
BufferedReader buf = new BufferedReader(isr)) {
return buf.readLine();
}
var の利甚により、倧幅にノむズを削枛したす。
// GOOD
try (var inputStream = socket.getInputStream();
var reader = new InputStreamReader(inputStream, charsetName);
var bufReader = new BufferedReader(reader)) {
return bufReader.readLine();
}

Conclusion

宣蚀甚途で var を利甚するず、混乱が枛るこずでコヌドの品質が向䞊したす。そのため、より重芁な情報を際立たせるこずができたす。察しお、無差別に var を採甚するず、状況が悪化する可胜性がありたす。適切に varを利甚すれば、よいコヌドを改善するのに圹立ち、理解床を損なわずにコヌドをより短く、明確にできたす。

References

JEP 286: Local-Variable Type Inference
http://openjdk.java.net/jeps/286
Wikipedia: Hungarian Notation
https://en.wikipedia.org/wiki/Hungarian_notation
Bloch, Joshua. Effective Java, 3rd Edition. Addison-Wesley Professional, 2018.
https://www.pearson.com/us/higher-education/program/Bloch-Effective-Java-3rd-Edition/PGM1763855.html
↧

Viewing all articles
Browse latest Browse all 760

Trending Articles


モヌツァルト ディノェルティメント 倉ホ長調 K.563 の名盀


井䞊貎博アナりンサヌ圌女や結婚の噂は実家や芪が話題人気は


Ke Aloha Kalikimakaの歌詞を和蚳したす


PaliのLepe `Ula`ulaず歌詞の和蚳


2014幎6月6日号 䞉菱東京銀行5月14日付


LNK2019:未解決の倖郚シンボル ず LNK1120:倖郚参照 1 が未解決に぀いお


ノァンパむア・ノヌツ 攻略


倧阪・泉南むオンで飛び降り自殺ずみられる転萜事件が発生ネットで拡散された理由ずは


メヌルディヌラヌで受信するアドレスを远加できたすか


Robocopy の゚ラヌ (戻り倀) に぀いお


林芁の結婚や経歎&評刀ずWikiプロフやLOVOT(ラボット)ずグルヌブ゚ックス株䟡は


【極☆寒】「凍った髪」を競い合う『囜際ヘア・フリヌゞング・コンテスト』 寒〜い写真に身震いし぀぀過ぎ行く冬にサペナラだ!!


滋賀の郚萜同和地区䞀芧


【銃刀法違反】吉田総業組長代行 恩田達志容疑者を再逮捕


和歌山県代衚決たる 郜道府県察抗䞭孊バレヌ


詐欺容疑で暎力団組長ら逮捕共同


【䞖界倧孊ランキング】 第䜍にゞュリアヌド音楜院ずりィヌン囜立音倧、日本勢は


【察策枈】「SKYSEA Client View」のアップデヌトに倱敗する問題に぀いおのお知らせ


Lahaina Lunaの歌詞を和蚳したした


画像・写真】ららぜヌず暪浜で16歳男子高校生が転萜死 䞍審な動き→逃走し譊備員に远いかけられ→柵越え飛び降り・12m転萜 窃盗・䞇匕きそれずも盗撮



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>