問題タブ [package-private]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java の内部パッケージ保護されたアクセス修飾子
私の知る限り、クラスにアクセス修飾子がある場合、Java 内部パッケージの保護されたアクセス修飾子 ( internal protected
C# など) でクラス メンバーに追加する古典的な方法は不可能public
です。これを行う方法やデザインパターンを知っていますか?
Java でこれを行うための構文サポートがないのはなぜですか? (または、なぜ C# にあるのですか?)
java - Javaコンパイラはインポートされていない名前をどのように解決しますか
パッケージのX
Java コンパイル ユニットで型を使用し、コンパイル ユニット自体で定義されておらず、直接インポートされていないことを考慮してください。Javaコンパイラはどのように効率的に解決しますか? 存在する可能性がいくつかあります。foo.bar
X
X
X
X
スターインポート経由でインポートされる可能性がありますa.b.*
X
コンパイル単位と同じパッケージに存在する可能性がありますX
言語タイプである可能性があります。つまり、次の場所に存在しますjava.lang
私が見る問題は特に(2.)です。はパッケージ プライベート タイプである可能性があるため、という名前のコンパイル ユニットに存在するX
必要さえありません。したがって、コンパイラはクラスパスのすべてのエントリを調べて、パッケージ内のクラスを検索する必要があります。次に、パッケージ内のすべてのクラスを読み取って、が含まれているかどうかを確認する必要があります。X
X.java
foo.bar
foo.bar
X
それは非常に高価に聞こえます。特に、単一のファイルのみをコンパイルする場合、コンパイラは type を見つけるためだけに数十のクラス ファイルを読み取る必要がありますX
。多くのスター インポートを使用する場合、この手順を多くの型に対して繰り返す必要があります (もちろん、クラス ファイルを 2 回読み取ることはありません)。
では、コンパイル プロセスを高速化するために、同じパッケージから型もインポートすることをお勧めしますか? または、見つけられなかったインポートされていない型を解決するためのより高速な方法はありX
ますか?
android - デフォルト (パッケージ) の可視性を持つ Android メソッドが ART で正しく呼び出されない
このような異なるパッケージに2つのクラスがあります。基本クラス:
および子クラス:
クラス Child のオブジェクトがあり、child.boo() を呼び出して、「Child」が出力されることを期待しています。これは本当に私が通常得るものです。Dalvik を使用すると、実際には常に機能します。しかし、ART に切り替えると、2 つの異なる出力が得られます。
Child クラスの「package tree」から child.boo() を呼び出すと「Child」を取得します。問題は、パッケージ com.example.artpackageprivate.base のクラスから呼び出すときです。オブジェクトはクラス Child のインスタンスですが、結果は「Base」です。
呼び出しを行っている Activity クラスのコードは次のとおりです (Activity には 2 つのボタンしか含まれていません)。
このコードを Dalvik と ART (両方とも android Kitkat) で実行すると、2 つの異なる結果が得られます。BaseButton を押すと、結果は常に「Base」になります。ChildButton の結果は、Dalvik では「Child」、ART では「Base」です。これはどのように可能ですか?ARTの何らかのバグですか?
java - javaでpackage-privateを使用して他のパッケージへのアクセスを許可する方法はありますか?
だから、私は何年も C# で働いていて、今は Java で働いています。C# では、internal キーワードを使用してクラス/メソッドをパブリック ビューから非表示にできますが、明示的に許可した場合は特定のアセンブリ/パッケージにアクセスを許可できます。Java を見回しても、内部とまったく同じものは見当たりません。
package-privateについて知りました。ただし、これにより、外界から完全に隠されます。Java で、公開せずに特定の他のパッケージが内部コードにアクセスできるようにする方法はありますか?
なぜ私がこれを行うのかと尋ねると、一般的にユニット/統合テスト、または特定の信頼できるパッケージがコードにアクセスして複製しないようにする必要があります。プライベート/内部コードをテストするべきではないと考える人がいることは知っています。また、内部アクセスを許可することは、一般的に優れたソフトウェア エンジニアリングではないことも知っています。これらのトピックについての議論にはあまり興味がありません。私がやりたいことをやってくれるかどうか知りたいだけです。
ありがとう。
java - javadoc とパッケージのプライベート インターフェイス?
これは、「Javadoc にパッケージ プライベート インターフェイスが表示されないようにするにはどうすればよいですか?」と同じ問題かもしれません。. しかし、私は状況が少し違うと思います。
javadoc を生成すると、John のページに次の定義が表示されます。
これは正常ですか?package-private インターフェイスで定義されたメソッドを非表示にする方法はありますか?
java - 実行時にラムダ式が java.lang.BootstrapMethodError で失敗する
1 つのパッケージ ( a
) には、2 つの機能インターフェイスがあります。
-
スーパーインターフェイスのapply
メソッドはself
として取りますA
。そうしないと、代わりに が使用された場合Applicable<A>
、パッケージの外部で型が見えなくなり、メソッドを実装できなくなるからです。
別のパッケージ ( b
) には、次のTest
クラスがあります。
最初の実装は匿名クラスを使用しており、問題なく動作します。一方、2 番目のものは正常にコンパイルされますが、インターフェイスにアクセスしようとすると、 ajava.lang.BootstrapMethodError
が原因で実行時に a をスローして失敗します。java.lang.IllegalAccessError
Applicable
ラムダ式が匿名クラスと同じように機能するか、コンパイル時にエラーが発生するかのどちらかであれば、より理にかなっていると思います。だから、私はここで何が起こっているのだろうと思っています。
スーパーインターフェースを削除して、次のようにメソッドを宣言しようとしましたSomeApplicable
:
これは明らかに機能しますが、バイトコードの違いを確認できます。
ラムダ式からコンパイルされた合成lambda$0
メソッドはどちらの場合も同じように見えますが、ブートストラップ メソッドの下のメソッド引数に 1 つの違いを見つけることができました。
からへの#59
変更。(La/Applicable;)V
(La/SomeApplicable;)V
ラムダメタファクトリーがどのように機能するかはよくわかりませんが、これが重要な違いかもしれません。
また、次のようにapply
メソッドを明示的に宣言しようとしました。SomeApplicable
これでメソッドapply(SomeApplicable)
が実際に存在し、コンパイラは のブリッジ メソッドを生成しapply(Applicable)
ます。それでも実行時に同じエラーがスローされます。
バイトコード レベルでは、LambdaMetafactory.altMetafactory
代わりにLambdaMetafactory.metafactory
以下を使用するようになりました。