C#では、クラスをinternal
としてマークして、同じパッケージ内からのみアクセスできるようにすることができます。 Javaに類似したものはありますか?
クラスの宣言からセキュリティ修飾子(public、private)を省略することにより、パッケージプライベートクラスを作成できます。
package com.sample;
class MyPackagePrivateClass
{
...
}
アクセス修飾子の削除は、C#の内部に似ています。
C#
public class A
{
public static int X;
internal static int Y;
private static int Z;
}
internal class B
{
public static int X;
internal static int Y;
private static int Z;
public class C
{
public static int X;
internal static int Y;
private static int Z;
}
private class D
{
public static int X;
internal static int Y;
private static int Z;
}
}
Java
public class A
{
public static int X;
static int Y;
private static int Z;
}
class B
{
public static int X;
static int Y;
private static int Z;
public class C
{
public static int X;
static int Y;
private static int Z;
}
private class D
{
public static int X;
static int Y;
private static int Z;
}
}
この質問には以前に受け入れられた答えがありますが、Java .Net。
JavaはC#の内部修飾子と完全に同等のものを持っていますか?短い答えはNOです(しかし、あなたはそれをいくらか達成することができ、教えてくれます)!!
c#のinternalは、実際には "Assembly-private"修飾子です。アセンブリとは何ですか?
アセンブリはプロジェクトの任意の製品です(C#のDLLまたはEXE-JavaはJARファイルにすることができます)
javaのinternalに正確に相当するものはありません。そして、Bryan Kyleによって回答され受け入れられたものは、実際には「パッケージプライベート」です(JavaのパッケージはC#のネームスペースと同等です)が、答えられた方法は同じ結果。
しかし、内部とまったく同じ結果を得る方法は? cant Javaこれに対する解決策がありますか?答えはYESです。
持っています。ただし、修飾子はありません。実際にこれを行う最良の方法は、パッケージングの秘密です。パッキングのベストプラクティスは、クラスをタイプではなく関係によってパックすることです。
私たちの多くは「Models」または「Presenters」という名前のパッケージを使用し、すべてのモデルまたはプレゼンターをそれらに入れます。これは非常に間違っていますが。パッケージは、「BookModel.Java」、「BookPresenter.Java」などを含む「Book」のようにする必要があります。
この方法では、修飾子を省略してパッケージプライベートにすることができ、パッケージングの優れた実践によりパッケージプライベートクラスを必要とするクラスでアクセスできるため、問題はありません。
私はC#に精通していませんが、Javaでは、デフォルトの保護は、パッケージ内でのみアクセスできることです:
public =誰でもアクセス可能
private =現在のクラス内でのみアクセス可能
protected =パッケージ内または現在のクラスを継承するクラス内でアクセス可能
default =パッケージ内でアクセス可能
「現在のクラスを継承するが、他の場所、このパッケージなどからは継承しないクラスからはアクセス可能」と言う方法があるべきだと常に考えていました。しかし、ありません。
はい。パッケージプライベートと呼ばれ、修飾子を付けずにクラスを定義するだけです。
package com.blah; class Foo{ }
クラスパッケージをローカルにすることができます。これは、クラスのデフォルトのスコープです。つまり、アクセス修飾子がない場所です。
本当にいつか入れたい場合は、注釈を作成できます。 @package_local、私はそれをパッケージローカルにしたい特定の場所でこれを行い、特定せずに放置しませんでした。
はい、デフォルト(パッケージプライベート)アクセスレベル。クラス定義のアクセス修飾子を省略して、必要なものを取得します。