28777
Javaには、クラスやメソッドについて、特定のパッケージやjarに対してのみpublic扱いとするような可視性設定はできますか？

目的は、ドメインレイヤのオブジェクトが持つEnum型フィールドの読み取りを、データアクセスレイヤに対してのみ許可したいのです。  
ドメインオブジェクトは、原則としてEnum型フィールドを非公開とし、`isActive()`のような判定用の`boolean`メソッドのみを公開します。  
ただ、これらの状態値は、最終的には整数としてDBに保存するため、データアクセスレイヤでEnum型フィールドに直接アクセスできると、コードがすっきりします。  
（isなんとかメソッドをたくさん調べて値を決定するのは大変です）

もちろん、コーディング規約レベルでみんなに守ってもらう、というやり方もありますが、「うっかり使ってしまった」を避けるために、できるだけ言語機能レベルでの制約を与えたいです。

確か、.NETでは、特定のインタフェース型として扱った時のみアクセスできる可視性制御ができますよね。  
公開先のパッケージやjarを特定できるものではないですが、このぐらいでも、うっかりを防ぐには十分ですね。

```

    public interface IFuga
    {
        int GetValue();
    }
    
    public class Hoge : IFuga
    {
        int IFuga.GetValue()
        {
            return 1;
        }
    }
    
    Hoge hoge = new Hoge();
    // hoge.GetValue() => compile error
    IFuga fuga = hoge;
    fuga.GetValue(); // => 1
    
```
CC BY-SA 3.0
2016-09-09T02:32:36.950
28771
2016-09-09T05:40:16.787
2016-09-09T02:39:44.537
8078
8078
question
java
特定のパッケージやjarに対してのみ公開する可視性設定は可能か？
Java言語では不可能ですが、OSGiフレームワーク（<https://ja.wikipedia.org/wiki/OSGi>）を使えば、もう少し詳細にバンドル（＝jar／war）単位でパッケージ毎の可視性を制御できます。しかし、アプリケーションはOSGiコンテナ上で動かさないといけません。

OSGiの仕様を実装したOSGiコンテナには、Apache Karafなどがあります。  
<http://karaf.apache.org/>
CC BY-SA 3.0
2016-09-09T05:40:16.787
28777
2016-09-09T05:40:16.787
244
28771
answer