アクセス制御(1)パッケージ、インポート

I.はじめに

    アクセス制御(または非表示の具体的な実装)と、関連する「初期の実装は適切ではありません」。

    それは完璧になったときに書き込みソフトウェアにそれらのプログラマーを含むすべての良い著者は、再作成するまで明らかに彼の本のいくつかの部分であり、時には、繰り返し何度も書き換え。あなたはその中にルックバックした後、特定の位置にスニペットを入れた場合は、同じ機能を実現するためのより良い方法を見つけることが可能です。これは、それが簡単に、より読みやすいので、より保守理解するために作るためにコードを書き換え、すなわち復興再建の原動力です。

    しかし、コードを変更し、改善するために、この願望のもと、多大な圧力があります。通常、常にいくつかの点で、あなたのコードが変更されないまま必要な一部の消費者(クライアントプログラマー)が存在します。あなたは、コードを変更したいのですが、彼らが望むように、コードは変更されません。このように考慮すべきオブジェクト指向設計における根本的な問題を作成します。「物事を分離し、変更物事はに同じゾーンを維持する方法。」

    これは、ライブラリー(図書館)に関しては特に重要です。ライブラリの消費者は、彼が使用するライブラリの一部に依存しなければならない、とライブラリの新しいバージョンがあるかどうかを知るために、彼らはコードを書き換える必要はありません。別の見方をすれ、クラスライブラリの開発者は、変更や改善を行うための権限を持っているし、クライアントコードは、これらの変更によって影響されないことを保証しなければなりません。

    この目標は合意によって達成することができます。ライブラリに変更したときには、クライアントのプログラマのコードを損なうので、例えば、ライブラリ開発者は、クラス内の任意の既存のメソッドを削除しないことに同意しなければなりません。しかし、逆の状況はより困難になります。ドメインの存在下でどのように我々は、ドメインを行うために、クライアントのプログラマによって呼び出された正確に何の知ることができる(すなわち、データメンバー)クラスライブラリの開発者を持っていますか?クライアントプログラマが直接これに用いる場合を望んでいないので、このメソッドは、クラスの実装の一部でしかありません。開発者は、古いプログラムの実装を削除するために、新たな実現を追加したい場合は、結果はどうなりますか?すべての変更は、クライアントのプログラマのコードのメンバーを損なう可能性があります。だから、クラスライブラリの開発者は、何の変更を行うことができない縛られた手と足になります。

    この問題を解決するために、Javaは使用できないクライアントプログラマーの開発ライブラリに使用できるかを指定するために、アクセス修飾子を提供します。最大から最小の権限権限へのアクセス制御レベルがあった:パブリック、保護、パッケージアクセス(キーワードなし)、民間。ライブラリーのデザイナーとして、あなたは可能な限り民間のが、唯一の開示の方法として、すべての方法は、あなたは、クライアントのプログラマにそれらの使用を聞かせて喜んでいるはずです。

    しかし、ライブラリコンポーネント制御の問題へのアクセス権を持っている人のための会員図書館のコンセプトなどはまだ不完全です。前記ライブラリ凝集ユニットのメンバーに結合する方法に問題がまだあります。このため、Javaがキーワードパッケージを制御し、かつによるクラスへの修飾子へのアクセスは、同じパッケージに存在し、まだ影響を受けた別のパッケージに存在します。

第二に、パッケージ:ライブラリユニット

    パッケージは、単一の名前空間の下で一緒に編成されているクラスのセットが含まれています。

    たとえば、java.utilの名前空間の下に編成されているJava標準のリリース、工具ライブラリがあります。ArrayListには、クラスと呼ばれるjava.util、それは指定された彼のフルネームでのArrayList java.util.ArrayListのを使用する方法があります。

public class FullQualification {
	public static void main(String[] args) {
		java.util.ArrayList list = new java.util.ArrayList();
	}
}

    インポートのキーワードに切り替えたいことがありので、これはすぐに、プログラムが非常に長くなってします。あなたが単一のクラスをインポートしたい場合は、import文にクラスに名前を付けることができます。

import java.util.ArrayList;

public class SingleImport {
	public static void main(String[] args) {
		ArrayList list = new ArrayList();
	}
}

    さて、あなたはArrayListの使用を制限することはできません。しかし、java.utilのやっので、他のクラスはまだ利用できません。それだけに「*」を使用する必要のあるすべてのクラスをインポートします。たとえば、次のようにインポートjava.utilの* ..

    私たちはインポートしたい理由は、名前空間を管理するためのメカニズムを提供することです。すべてのクラスのメンバーの名前は、互いに分離されています。方法F Aクラスメソッドf()と同じシグネチャ(パラメータリスト)とクラスB()は相互に競合しません。しかし、お互いにクラス名の競合はどのようにすればよいですか?どのように我々はそれを解決するのです、あなたはStackクラスを作成し、マシンにインストールし、マシンのStackクラスの人々を書かれていると仮定?そのため、フルコントロールでのJavaの名前空間の名前の間に競合する可能性や、各クラスの組み合わせの一意の識別子を作成するには、非常に重要なものとなっています。

    一般にコンパイル単位(時には変換部と称する)と呼ばれるJavaソース・コード・ファイルを書き込む場合。各コンパイル単位は、.javaファイルの拡張子を持っている必要がありますし、公共のクラスにコンパイル単位を持つことができ、ファイルのクラス名は同じ名前でなければなりません(場合を含むが、拡張子は.javaファイルが含まれていません) 。各コンパイル単位は一つだけのパブリッククラスを持つことができ、またはコンパイラは受け付けません。コンパイル単位で追加のクラスがある場合、彼らは公共のクラスではありませんので、パッケージの世界の外に、これらのクラスは見えません、そして、彼らは主にクラスベースの国民の支持を提供するために使用されています。

第三に、コードの組織

    .javaファイルをコンパイルすると、.javaファイル内の各クラスは、各クラスの.javaファイルと出力ファイルと出力ファイル、および同じ名前を持っていますが、拡張子.classファイルとなります。したがって、.javaファイルの数が少ないコンパイルした後、あなたは.classファイルの多くを得ます。コンパイルされた言語でプログラムを書いた場合、コンパイラは、中間ファイル(典型的には、OBJファイル)を生成し、コネクタを介して(実行可能ファイルを作成する)またはライブラリジェネレータ(Librarianは、作成します他の類似した文書のライブラリーは)珍しくないかもしれませんが、一緒にバンドルされて生成します。しかし、これは、Javaの仕事ではありません。Java実行可能ファイルがセットされ、Java圧縮文書ファイル(JAR、Javaのドキュメントジェネレータを使用してjarファイル)としてパッケージ化することができる.classファイル。Javaインタプリタは、これらのファイル、読み込みや解釈を見つけるための責任があります。

    ライブラリは、実際には、クラスファイルのセットです。各カテゴリのファイルは、公開、非公開、およびクラスの任意の数を有しています。したがって、各ファイルには、メンバーを持っています。あなたはこれらのコンポーネント(自分の別の.javaファイルと.classファイルとそれぞれ)が同じグループに属したい場合は、キーワードパッケージを使用することができます。

    あなたは、パッケージステートメントを使用する場合は、コメントに加えて、プログラムコードの最初の文でのファイルでなければなりません。ファイル書き込みの初めに:パッケージアクセス;それはあなたがユニットがアクセスの傘の名の下に配置されていることを声明でコンパイルを意味します。その名前を使用したい人は、先に与えられた選択するために使用されている必要があり、組み合わせて完全な名前やキーワードをインポートし、アクセスを指定します。(してくださいだけでなく、単語の真ん中を含め、すべて小文字の文字をパッケージ化するJavaの命名ことに注意してください。)

    たとえば、ファイル名がファイル内に、唯一の公共のクラスがあることを意味するMyClass.java、であると仮定し、クラスの名前は、MyClassの(大文字と小文字に注意してください)でなければなりません。

package access.mypackage;

public class MyClass {

}

    誰かがMyClassのを使用したり、他のパブリッククラスにアクセスしたい場合さて、あなたは利用可能なアクセスの名前を作るためにimportキーワードを使用する必要があります。別のオプションは、完全な名前を与えることです:

public class QualifiedMyClass {
	public static void main(String[] args) {
		access.mypackage.MyClass m = new access.mypackage.MyClass();
	}
}

    importキーワードは、より簡潔にそれを作ることができます。

import access.mypackage.MyClass;

public class ImportedMyClass {
	public static void main(String[] args) {
		MyClass m = new MyClass();
	}
}

    ライブラリーのデザイナーとして、心に留めする必要があります:パッケージとインポートのキーワードは、あなたが行うことができ、単一のグローバルネームスペースは、インターネットを使用して、Javaクラス名を書き始めるどのように多くの人に関係なく表示されないように分離され、競合の問題。

第四に、カスタマイズツールライブラリ

    この知識を武器に、あなたは今、軽減またはプログラムコードを重複排除するためのツールを独自のライブラリを作成することができます。例えば、我々はのSystem.out.println()は、出力負荷をカプセル化することによって減少させることができる使用し、我々はより読みやすいようにAを使用することができますので、このメカニズムは、クラスの名前を印刷して使用することができます輸入への静的なimport文:

public class Print {
	public static void println(Object obj) {
		System.out.println(obj);
	}

	public static void println() {
		System.out.println();
	}

	public static void print(Object obj) {
		System.out.print(obj);
	}

}

    それはラップ(のprintln())が必要であるかどうか、あなたは文字列を印刷するのに使用することができます簡単なツールを印刷したり(印刷を())ラップする必要はありません。このファイルは通常、utilのパッケージの下に置かれています。コンパイル後は、インポート、静的ステートメントを使用して、システム内の静的プリント()とのprintln()メソッドを使用することができます。

import static com.buba.util.Print.*;

public class PrintTest {
	public static void main(String[] args) {
		println("Available from now on!");
		println(100);
		println(100L);
		println(3.14159);
	}
}

    今から、あなたは便利な新しいツールを作成するたび、あなたはあなた自身のクラスライブラリに追加することができます。

发布了72 篇原创文章 · 获赞 2 · 访问量 7868

おすすめ

転載: blog.csdn.net/qq_40298351/article/details/104082918