web-dev-qa-db-ja.com

Javaの内部クラスのようなものはありますか?

C#では、クラスをinternalとしてマークして、同じパッケージ内からのみアクセスできるようにすることができます。 Javaに類似したものはありますか?

38
Svish

クラスの宣言からセキュリティ修飾子(public、private)を省略することにより、パッケージプライベートクラスを作成できます。

package com.sample;

class MyPackagePrivateClass
{
    ...
}
55
Bryan Kyle

アクセス修飾子の削除は、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;
    }
}

ソース: http://www.javacamp.org/javavscsharp/internal.html

8
Steven Jeuris

この質問には以前に受け入れられた答えがありますが、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」のようにする必要があります。

この方法では、修飾子を省略してパッケージプライベートにすることができ、パッケージングの優れた実践によりパッケージプライベートクラスを必要とするクラスでアクセスできるため、問題はありません。

5
Amir Ziarati

私はC#に精通していませんが、Javaでは、デフォルトの保護は、パッケージ内でのみアクセスできることです:

public =誰でもアクセス可能

private =現在のクラス内でのみアクセス可能

protected =パッケージ内または現在のクラスを継承するクラス内でアクセス可能

default =パッケージ内でアクセス可能

「現在のクラスを継承するが、他の場所、このパッケージなどからは継承しないクラスからはアクセス可能」と言う方法があるべきだと常に考えていました。しかし、ありません。

1
Jay

はい。パッケージプライベートと呼ばれ、修飾子を付けずにクラスを定義するだけです。

package com.blah; class Foo{ }

1
Steven Fines

クラスパッケージをローカルにすることができます。これは、クラスのデフォルトのスコープです。つまり、アクセス修飾子がない場所です。

本当にいつか入れたい場合は、注釈を作成できます。 @package_local、私はそれをパッケージローカルにしたい特定の場所でこれを行い、特定せずに放置しませんでした。

0
Peter Lawrey

はい、デフォルト(パッケージプライベート)アクセスレベル。クラス定義のアクセス修飾子を省略して、必要なものを取得します。

0
jarnbjo