Java 1.4.2以降に見逃していたものに追いつくのを手伝ってください[終了]


14

私はソフトウェア開発者としての最初のプロとしてのキャリアを開始しようとしています。そして、私は多くのJavaコードを書くことになるでしょう。私が具体的に何を書いているかについてはあまり知りませんが、さらに、とにかくコードに関してはかなり幅広い興味を持っています。

議論するに値しない理由のために、私の最後のインターンシップでは、Java 1.3および1.4 SDKのみをコーディングしました。また、私の大学教育は、言語の機能やライブラリではなく、主にアルゴリズム、データ構造、その他の理論に焦点を当てています。

したがって、上記を念頭に置いて、現在のバージョンのJavaのどの機能、クラスなど(とにかく、現在どのくらいの数になっていますか?)プログラマーとしてのあなたの人生を楽にする1.4.2以来、私が見落としていたことは何ですか?

特定のパッケージなどを見つけて使用する方法の例とストーリーも素晴らしいでしょう。


4
議論する価値がないこれらの理由は何ですか?私たちの多くは...興味をそそられている
5arx

@ 5arxまあ、ロボット工学プログラミング用のJavaバージョン1.4を使用しました。何らかの理由でプラットフォームがサポートしているからです。
ダニエル・グラッツァー

回答:


15

私が最も重要だと考える変更は次のとおりです。

  • ジェネリック(たとえば、Setなどの型付きコレクション)

  • 拡張forループ(for(String s:set){...})

  • オートボクシング/アンボクシング(整数から整数へ、またはその逆への自動変換)

  • 型保証された列挙(enumはキーワードになりました。型は列挙から作成できます)

  • 可変引数(printf()関数の場合、可変数の引数が許可されます)

  • 静的インポート(java.lang.Mathなどのクラスの静的メソッドをインポートできるようになりました)

  • 注釈

  • java.util.concurrent(javaの並行性を実証します)

また、どのJavaを目指していますか?、3つのバージョンのそれぞれをよりよく理解するために。


1
++オートボクシング/アンボクシング、拡張forループ、可変引数、静的インポートは簡単です
マイケル・ワイルズ

Javaプログラマーがfor-eachループを「拡張forループ」と呼ぶのはなぜですか?
Maxpm

2
@Maxpm Java言語仕様でそれが呼び出される方法だからです。JLSごとに、基本的なforループと拡張されたforループがあります。彼らがなぜそうすることを決めたのかはわかりません。たぶん、構文は特別なキーワードを使用せず、通常のループとブレンドするためです。
マルコム

10

日々のプログラミングライフで最も重要な変更は、ジェネリックの導入ですを記述するよう求められるすべての新しいモジュールで使用される可能性が高く、混乱を招く新しい構文です。

ジェネリックは、たとえばa Listが裸のオブジェクトの代わりに文字列を含むことを可能にするメカニズムです。コンパイラは、リストに入れる項目が文字列であることを強制し、リストから項目を取得するときに文字列であることを認識します。

これにより、ターゲットタイプへの明示的なランタイムキャスト(間違えた場合に頻繁にエラーが発生する)を回避し、IDEはコードについてより多くのことを知っているため、すべての汚い作業を行うのに役立ちます。単なるオブジェクトのリストの場合にそうでした。

Joshua BlochがGenericsの優れた紹介を書きました。これは、http://java.sun.com/docs/books/effective/でサンプルの章として利用できます。


Groovyの人には言わないでください!「これにより、ターゲットタイプへのランタイムキャストが回避されるため、プログラムの品質が向上します。」def whatever....
ダンRosenstark

@Yar、より明確になるように編集。私は考えLOVE「DEF」または「VAR」属性を。私の人生が少し楽になるでしょう。

はい、私はObjective-Cでこれを最近考えてidいましたが、それは... defまたはそれからvarです...しかし、再び、100%静的型付けの安全性は本当に素晴らしいです。
ダンローゼンスターク

@Yar:Adaを好きになる:)
mattnz

@mattnzなぜ、特に?そして、私たちがここにいる間、それはJVMで実行されますか?
ダンローゼンスターク

6

オートボクシングはJava 5で導入された優れた機能です。C#と同様に、コンパイラはプリミティブ(基本)型とそれに対応するオブジェクトラッパークラス(intからIntegerなど)の間の自動変換を行います。これにより、Javaコレクションでの作業が大幅に軽減されます。

For-eachループもJava 5で新しくなったと思います。配列(およびコレクション)の反復処理が容易になります。これは、インデックス変数またはイテレータのセットアップと管理に伴う通常の混乱の多くを排除するためです。例:

void myMethod(Collection<myObjectType> c) {
    for (myObjectType o : c)
        o.foo();
}

6

Enumsは、最終的な静的変数と定数を置き換え、文字列とマジックナンバーへの参照を削除するのに役立ちます。sun / oracleの善良な人々からの例:

public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7),
    PLUTO   (1.27e+22,  1.137e6);

    private final double mass;   // in kilograms
    private final double radius; // in meters
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    public double mass()   { return mass; }
    public double radius() { return radius; }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    public double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    public double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
}

そして

public static void main(String[] args) {
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/EARTH.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Your weight on %s is %f%n",
                             p, p.surfaceWeight(mass));
    }

6

java.util.concurrentは1.5で導入されました。これを学習するための最良のリソースは、(おそらく)Java同時実行性の練習帳です。IMHOの並行性は、他のどの製品と比較してもJavaの最も重要な競争上の優位性です。


1
+1同時実行パッケージについて言及するために。多くの開発者がまだスレッド、wait()/ notify()、同期などの同時実行プリミティブを使用しているのは残念です...
Oliver Weiler

確かに。java.util.concurrent同時実行プリミティブは、自動メモリ管理から手動メモリ管理に似ています。後者の使用は、デバッグにより多くの時間を費やすための単なるレシピであり、利点はありません。
ジョナスプラッカ

死刑執行人!さらに良いのJava 6で

できれば+1000-その本は素晴らしいです
ゲイリーロウ

4

まあ、StringBuilder私のプログラムをスピードアップするのに役立ちました。これは、StringBufferスレッドセーフなしの場合と同等です。


うん。有効なJavaは、StringBufferは廃止され、StringBuilderに置き換える必要があると述べています。
ゲイリーロウ

1
+ソースレベル1.5以降では、文字列の連結では、StringBufferの代わりにStringBuilderが自動的に使用されます。

4

@ykombinatorからの有用な回答を分類することでお手伝いします。彼のリストは、「一般的な」Java開発を行う際に日常的に使用する要素のリストです。

影響が少なく難易度が低い:

  • 拡張forループ(for(String s:set){...})
  • オートボクシング/アンボクシング(整数から整数へ、またはその逆への自動変換)
  • 可変引数(printf()関数の場合、可変数の引数が許可されます)
  • 静的インポート(java.lang.Mathなどのクラスの静的メソッドをインポートできるようになりました)

影響が大きく、難易度が中程度:

  • 型保証された列挙(enumはキーワードになりました。型は列挙から作成できます)

インパクトが大きく難易度が高い:

  • 注釈
  • ジェネリック

影響が少なく、難易度が高い(高度なスレッディングを行わない限り使用のみ)

  • java.util.concurrent(javaの並行性を実証します)

したがって、影響の少ない難易度の低いピースのドキュメント/ヘルプを読むことをお勧めします-簡単に手に入れることができます。アノテーションとジェネリックに時間をかける-アノテーションは非常に便利であり、ジェネリックはかなり複雑になる可能性があります。

スレッド化を行う必要がある場合にのみ、新しい並行性コンテンツを確認してください。


4

50歳未満なのでコメントできないので、答えを残します。すでに言及されていますが、もう一度繰り返します:注釈! この種のメタデータは、長年のJavaの経験において最も重要なものになりました。一部のフレームワークのようによく使用されているため、コードがより簡潔でクリーンになります。たとえば、注釈は次のことができます。

  • オブジェクトをエンティティ@Entityに変換します
  • メソッドをRESTサービス@GETに変換する
  • メソッドがnull @nonnullを決して返さないことを説明する
  • オブジェクトを依存性注入@injectのフィールドに設定します

そしてもちろん、独自の注釈を作成して、リフレクションを使用してメソッド、クラス、またはフィールドに注釈が付けられているかどうかを知ることができます。


2
正確には注釈これらのことを行うことができません。メタ情報をコードに入れるだけなので、他のコード(多くの場合、特別なクラスローダー)がアクションを実行できます。アノテーションは、多くの問題に対する非常に優れた一般的なソリューションであると考えています。

3

模範的な学習は私のために働く

慣用的なJava 6の簡単な例を示します

public class Main {
  public static void main(String[] args) {
    // Shows a list forced to be Strings only
    // The Arrays helper uses generics to identify the return type
    // and takes varargs (...) to allow arbitary number of arguments
    List<String> genericisedList = Arrays.asList("A","B","C");

    // Demonstrates a for:each loop (read as for each item in genericisedList)
    for (String item: genericisedList) {
      System.out.printf("Using print formatting: %s%n",item);
    }

    // Note that the object is initialised directly with a primitive (autoboxing)
    Integer autoboxedInteger = 1;
    System.out.println(autoboxedInteger);

  }
}

Java5を気にしないでください、Java6に関しては非推奨です。

次のステップ、注釈。これらは、注釈リーダーがボイラープレート構成を入力できるようにするコードの側面を定義するだけです。JAX-RS仕様を使用する単純なWebサービスを検討してください(RESTful URIを理解します)。厄介なWSDLをすべて実行したり、Axis2などをいじったりしたくないので、迅速な結果が必要です。右、これを行います:

// Response to URIs that start with /Service (after the application context name)
@Path("/Service")
public class WebService {

  // Respond to GET requests within the /Service selection
  @GET
  // Specify a path matcher that takes anything and assigns it to rawPathParams
  @Path("/{rawPathParams:.*}")
  public Response service(@Context HttpServletRequest request, @PathParam("rawPathParams") String rawPathParams) {
    // Do some stuff with the raw path parameters 

    // Return a 200_OK
    return Response.status(200).build();
  }
}

バング。web.xmlに設定マジックを少し振りかけるだけです。Mavenを使用してビルドし、Jettyプラグインを構成している場合、プロジェクトにはすぐに独自の小さなWebサーバーがあり(JBossやTomcatをいじる必要はありません)、上記のコードはのURIに応答します形:

GET http://localhost:8080/contextName/Service/the/raw/path/params

仕事完了。


3

それは過去からの爆発でした!私はJavaを4年間使用していません-その間、何も変わっていません!

ありますバージョンによって機能のリストは、しかし、ここでは(もちろん盗用)重要なビットです...

J2SE 5.0(2004年9月30日)

  • ジェネリック:コレクションのコンパイル時(静的)型の安全性を提供し、ほとんどの型キャスト(型変換)の必要性を排除します。
  • メタデータ:注釈とも呼ばれます。クラスやメソッドなどの言語構成要素に追加データをタグ付けし、メタデータ対応ユーティリティで処理できるようにします。
  • オートボクシング/アンボクシング:プリミティブ型(intなど)とプリミティブラッパークラス(Integerなど)間の自動変換。
  • 列挙:enumキーワードは、値の型保証された順序付きリスト(Day.MONDAY、Day.TUESDAYなど)を作成します。以前は、これは非タイプセーフ定数整数または手動で構築されたクラス(タイプセーフ列挙型パターン)によってのみ達成できました。
  • Swing:シンセと呼ばれる新しいスキン可能なルックアンドフィール。
  • 変数:メソッドの最後のパラメーターは、タイプ名の後に3つのドットが続くように宣言できるようになりました(たとえば、void drawtext(String ... lines))。呼び出し元のコードでは、その型のパラメーターをいくつでも使用でき、それらを配列に配置してメソッドに渡すか、呼び出し元のコードでその型の配列を渡すことができます。
  • forループの強化:forループ構文は、次の形式の構造を使用して、標準コレクションクラスなどの配列またはIterableの各メンバーを反復処理する特別な構文で拡張されます。

Java SE 6(2006年12月11日)

  • 古いWin9xバージョンのサポートは廃止されました。非公式のJava 6 Update 7は、これらのバージョンのWindowsで動作することが示されているJavaの最後のリリースです。これは、Update 10の大きな変更によるものと考えられています。
  • スクリプト言語のサポート:スクリプト言語との緊密な統合のための汎用API、および組み込みのMozilla JavaScript Rhino統合
  • コアプラットフォームとSwingの劇的なパフォーマンスの向上。
  • JAX-WSによるWebサービスサポートの改善
  • JDBC 4.0サポート。
  • JavaコンパイラAPI JavaプログラムがJavaコンパイラをプログラムで選択して呼び出すことを可能にするAPI。
  • JAXBのバージョン2.0へのアップグレード:StAXパーサーの統合を含む。
  • プラグ可能な注釈のサポート
  • APIでのSwingWorkerの統合、テーブルの並べ替えとフィルタリング、真のSwingダブルバッファリング(グレー領域効果の排除)など、GUIの多くの改善。
  • JVMの改善には、同期とコンパイラーのパフォーマンスの最適化、新しいアルゴリズムと既存のガベージコレクションアルゴリズムのアップグレード、アプリケーションの起動パフォーマンスが含まれます。

それについてです。Java SE 7.0はより面白そうですが、まだリリースされていません。

過去4年間にC#に追加された新しい言語機能とAPIの数を考えると、私は非常に驚いています。Sun / Oracleで何が起こっているのですか?


SunはJavaをオープンソース化することを決めました。これはオラクルが何を決定したかに関係なく、LinuxボックスでOpenJDKを実行できることを保証しものです。18〜24か月遅れただけです。

@Thorbjørn-それはそれを説明するかもしれません。この買収がどれほどの混乱を引き起こしたかは残念です。C#は比較的安定していると思います。2006年以来ラムダがあります。ラムダは2012年までJavaに入らないように見えます。
シェイクジャブーティー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.