2011-07-31 3 views
3

非公開メソッドのパラメータがプライベート型(プライベートネストされたクラスなど)の場合、g ++およびjavacでは警告が出力されません。このようなメソッドはクライアントで使用することはできませんが、クラスのパブリックAPIの一部として使用できます。パブリックメソッドのプライベートパラメータ

C++では、たとえば、Fooクラスのpublicセクションにこのようなメソッドを配置すると、他のクラスがFooクラスの中で友人として明示的にリストされることなくこれらのメソッドにアクセスできるようになりますパラメータとして)。

しかし、一般的に、このようなメソッドを非公開にしないと悪いスタイルになりますか?これは無視できますか? (クライアントはとにかくそれを使用できないので、大したことは何ですか)

+0

これは本物の間違いですか、なぜこれをやりたいのですか? –

答えて

4

これは許可されている可能性があります。

プライベートタイプの変数を作成することはできませんが、それは関数によって戻ってくるかもしれない。これにより、参照を保持する理由がないシステムの部分に永続化されることなく、データがシステムの周りを転送されることが可能になる。

このイディオムは一般的ではありませんが、許可されています。

+0

一般的なオブジェクトインスタンスとしてプライベートタイプを返し、それらのインスタンスをシステムを介して渡す場合は間違いありません。しかし、少なくともJavaでは、このような型をパラメータとして必要とするメソッドは、実際には外部コードから呼び出すことはできません(おそらくReflectionからは除外されます)。その代わりに、メソッドはそのパラメータをObjectとして受け入れ、次に内部的に実際の型にキャストする必要があります。 – aroth

+0

私はそれを試しました: "w.foo(w.qux());"ここで、qux()はwのprivate内部クラスを返します。これは別のクラスから呼び出されます。それは私の驚きにいくらか働きます。 Javaを使用しています。 –

+0

ああ、私はあなたが何をしたかを見ています。賢いしかし 'Object qux = w.qux();'の後に 'w.foo(qux);'が続くとうまくいけばうまくいきません。したがって、本質的には、後で再利用するために 'w.qux()'の結果を保持することはできません。いつでも使用したいときに呼び出す必要があります。 – aroth

3

パブリックAPIの一部としてこれらのメソッドを使用すると、スタイルが悪いと見なされます。ライブラリを使って作業しているときにIDEのオートコンプリートダイアログで実際に呼び出すことができないメソッドを本当に見たいですか?私はそうは思わない。

なぜコンパイラの警告がないのかについては、ほとんどの(おそらくすべて?)オブジェクト指向言語(と確かにJava)では、ユーザー定義のオブジェクト型は単にポインタを使ってメソッドに渡されます。だから、実際の型についての知識は、関数パラメータとしての参照を渡すために必要なことではなく、ポインタに関する知識だけです。コンパイラが気にする限り、誰もがポインタを作成する方法について知識を持っているので、「実際にはこれを外部的に呼び出すことはできません」と言うことはできません。少なくともnullの値で呼び出すことができます。

+0

コンパイラがタイプが厳密にプライベートであるかどうかを判断する方法がないため、少なくともC++では警告がないことがあります。まったく警告するためには、とてもスマートなリンカ(多くの前提があります)に頼らざるを得ません。 –

+0

+1このイディオムが有効な用途であっても、そのようなものを特に意図しない限り、おそらく悪いスタイルです – ManRow

関連する問題