パッケージの命名
パッケージ名は他のパッケージとの競合を避ける必要があるため、意味のあるもので一意の両方の名前を選択することは、パッケージデザインの重要な側面です。ただし、世界中のプログラマーがパッケージを開発しており、誰がパッケージ名を使用したかを知る方法はないため、唯一のパッケージ名を選択することは問題です。パッケージが組織内でのみ使用されていると判断した場合、プロジェクト間に名前の競合がないことを確認するために、内部アービターを持つことができます。
しかし、全世界では、このアプローチは実用的ではありません。パッケージ識別子はすべて簡単な名前であり、パッケージ名がインターネットドメイン名を使用することを確認するためのより良い方法です。私たちが働いている会社が魔法です。lncで、会社のドメイン名がMagic C.comである場合、属性パッケージの宣言は次のとおりです。
パッケージcom.magic.attr;ここのドメイン名構成要素は、従来のドメイン名の逆順序で配置されていることに注意してください。
このイディオムを採用した場合、使用するパッケージ名は、組織内の競合の可能性を除いて、他の人と矛盾しません。私たちの組織内に実際に対立がある場合(おそらく大企業)、より具体的なドメイン名を使用してさらに資格を得ることができます。多くの大企業には、東部やヨーロッパなどの内部サブドメインがあります。これらは、パッケージの名前をさらに修飾するために使用できます。
パッケージcorn.magic.japan.attr;
このソリューションを使用すると、パッケージ名が非常に長くなる可能性がありますが、比較的安全です。この手法を使用するプログラマは同じパッケージ名を選択しません。この手法を使用しないプログラマーは、使用する名前を選択しません。
パッケージアクセス
パッケージ内のトップレベルのクラスとトップレベルのインターフェイスのアクセシビリティを宣言する場合、パッケージアクセス(パッケージ)とパブリックアクセス(パブリック)の2つのオプションがあります。一般に変更されたクラスまたはインターフェイスには、パッケージ外のコードでアクセスできますが、公開されていないタイプにはパッケージスコープがあります。同じパッケージの他のコードでアクセスできます。ただし、サブパッケージコードであっても、パッケージ外のコードのために隠されています。タイプを宣言する場合、他のプログラマーがパブリックとして使用する必要があるタイプのみを宣言し、パッケージの実装の詳細に属するタイプを非表示にする必要があります。このテクノロジーは私たちに大きな柔軟性を提供し、プログラマーはアクセスできないこれらのタイプの実装の詳細に依存していないため、実装の詳細を変更するときに自由に変更できます。
公共、保護、またはプライベートとして宣言されていないクラスメンバーは、パッケージ内の任意のコードで直接アクセスできますが、パッケージの外側から隠されています。つまり、デフォルトのアクセス修飾子は「パッケージ」であり、インターフェイスのメンバーを除き、デフォルトのアクセス修飾子は「public」です。
パッケージ内でプライベートと宣言されていないフィールドまたはメソッドは、そのパッケージ内の他のすべてのコードからアクセスできるため、同じパッケージのクラスは「フレンドリー」または「信頼できる」と見なされます。これにより、事前定義されたコードとプレースホルダーコードを組み合わせたアプリケーションフレームワークを定義することができます。ここでは、プレースホルダーコードがフレームワーククラスのサブクラスによってオーバーライドされます。事前定義されたコードは、パッケージアクセス修飾子を使用して、パッケージ内の他の共同コードが直接アクセスできるようにしますが、パッケージ外のユーザーの場合、これらのコードはアクセスできません。ただし、これらのコードが配置されているパッケージのサブパッケージは信頼されておらず、その逆も同様です。たとえば、パッケージDITのパッケージアクセス修飾子で変更されたコードは、子パッケージdit.datのコードではアクセスできません。
したがって、各タイプは3つの異なる契約を定義します。
アクセシビリティとカバー方法
スーパークラスでアクセス可能な方法のみをサブクラスに上書きできます。スーパークラスのメソッドにアクセスできない場合、サブクラスのメソッドがメソッドと同じ名前を持っていても、メソッドをサブクラスでオーバーライドすることはできません。ランタイム時にメソッドが呼び出されると、システムはそのアクセシビリティを考慮して、どの実装が実行されているかを決定します。
以下の特別に構築された例をより明確に説明します。 P1パッケージで抽象的なベースクラスを宣言するとします。
パッケージP1; {ab abab abab public abstract class abstractbase private void pri(){print( "stractbase.pri()"):} void pac(){print( "stractbase.pac()");}プロテクションvoid pro(){print( "stractbase.pro()") void show()pri(); pac(); pro();パブ(); }}このクラスでは、それぞれ異なるアクセス修飾子を持つ4つのメソッドを定義し、メソッドの本文はそれ自体のみを識別します。このメソッドは、現在のオブジェクト上のこれらの4つのメソッドを順番に呼び出します。この方法をさまざまなサブクラスオブジェクトに適用すると、これらのメソッドのどの実装が呼び出されるかを説明できます。
次に、AbstractBaseクラスを拡張しますが、P2パッケージにあります。
パッケージP2; P1.ABSTRACTBASEパブリッククラスconcreTel拡張abstractBase {public void pri(){print( "concretel.pri()");} public void pac(){concretel.pac() ");} public void pro(){concretel.pro()") ") pub(){print( "concretel.pub()");}}スーパークラスの4つの方法はこのクラスで再宣言され、その実装が変更され、それらがCon-Cretelクラスに属していることを報告しています。同時に、彼らのアクセス権は、他のコードがアクセスするために公開されています。次のコードを実行します
新しいconcretel()。show():
次の出力が生成されます。
abstractbase.pri()abstractbase.pac()concretel.pro()concretel.pub()
プライベートメソッドPRIにサブクラス(または他のクラス)でアクセスできないため、showメソッドは常にAbstractBaseクラスでPRIメソッドの実装を呼び出します。 AbstractBaseクラスのパッケージアクセス権限を備えたPACメソッドは、ConcreTelでアクセスできないため、ConcreTelクラスでPACメソッドの実装はAbstractBaseクラスの定義をオーバーライドできないため、showメソッドはAbstractBase.pacメソッドを呼び出します。 ProメソッドとPUBメソッドはどちらもコンクリーテルクラスでアクセスでき、上書きすることができるため、showメソッドはコンクリーテルクラスでこれら2つのメソッドの実装を呼び出します。
クラスコンクリートを拡張するには、クラスのConcrete2を意味するFoot Meaning Class Concretelに従ってから、AbstractBaseクラスと同じパッケージP1に入れます。
パッケージP1; Import P2.ConcreTel Public Class Concrete2 Extends ConcreTel {public void pri(){print( "concrete2.pri()");} public void pac(){print( "concrete2.pac()") pub(){print( "concrete2.pub()");}}Concretelのメソッドにはパブリックアクセス権があるため、Concrete2でアクセスでき、Concrete2の各方法は対応する方法を個別にカバーします。さらに、Concrete2とAbstractBaseは同じパッケージに含まれているため、メソッドabstractBase.pacにもconcrete2にアクセスでき、メソッドconcrete2.pacはオーバーライドできます。 concrete2オブジェクトのshowメソッドを呼び出すと、印刷の結果は次のとおりです。
abstractbase.pri()concrete2.pac()concrete2.pro()concrete2.pub()
最後に、クラスConcrete3を定義してクラスConcrete2を拡張し、パッケージP3に入れます。
パッケージP3インポートP1.Concrete2; Public Class Concrete3はconcrete2を拡張します{public void pri(){print( "concrete3.pri()");} public void pac q {print( "concrete3.pac()");} puply void pro(){print( "concrete3.pro()");} print show() concrete3オブジェクト、および印刷の結果は次のとおりです。AbstractBase.pri()concrete3.pac()concrete3.pro()concrete3.pub()ここで、メソッドconcrete3.pacはアクセス不可のabstractbase.pacメソッドを無効にしているように見えますが、実際、メソッドconcrete3.pacはメソッドconcrete2.pac、およびメソッドconcrete2.pacをオーバーライドし、メソッドabstractbase.pacをオーバーライドします。クラスConcrete2のPACメソッドをパブリックアクセス権限を持つように再編成することにより、あらゆるサブクラスがアクセスして上書きすることができます。 '