web-dev-qa-db-ja.com

この時点で、Javaのパブリックフィールドは歴史的な悲惨な設計上の欠陥にすぎませんか?

Java正統派のようです)基本的にオブジェクトの状態にパブリックフィールドを使用するべきではありません(必ずしも同意する必要はありませんが、それは私の質問には関係ありません)。私たちが今日いるところから、Javaのパブリックフィールドが言語設計の誤り/欠陥であったことは明らかですか?それとも、今日でも、Javaのパブリックフィールドは言語の有用かつ重要な部分であるという合理的な議論があります?

ありがとう!

pdate: C#、Python、Groovyなどのよりエレガントなアプローチについて知っています。これらの例を直接探しているわけではありません。バンカーの奥深くにまだ誰かがいるのか、公共の場が本当に素晴らしいのか、大衆が羊だけなのかなどとつぶやいているのではないかと本当に思っています。

pdate 2:明らかに静的な最終パブリックフィールドは、パブリック定数を作成する標準的な方法です。オブジェクトの状態(不変状態でも)にパブリックフィールドを使用することについて、さらに言及しました。パブリックフィールドを定数に使用する必要があるのは設計上の欠陥のように思われますが、状態には使用できません...言語のルールは、ガイドラインではなく構文によって自然に適用する必要があります。

17
Avi Flax

フィールドがfinalであり、アプリケーションの内部でのみ使用され、他のアプリケーションのAPIで公開されていない限り、私はそれらが好きです。これにより、コードが短く、読みやすくなります。

APIでパブリックフィールドを公開しないでください。パブリックフィールドを公開すると、実装も公開されます。代わりにgetXXX()メソッドとして公開すると、APIインターフェースを変更せずに実装を変更できます。例えば。リモートサービスから値を変更して取得することもできますが、APIを使用するアプリケーションはこれを知る必要はありません。

これは、immutableクラスのpublic finalフィールドの実行可能な設計です。

からEffective Java

アイテム14:パブリッククラスでは、パブリックフィールドではなく、アクセサーメソッドを使用します

...クラスがパッケージプライベートであるか、ネストされたプライベートクラスである場合、データフィールドの公開に本質的に問題はありません。このアプローチは、アクセサーメソッドのアプローチよりも煩雑さを減らします。

パブリッククラスがフィールドを直接公開することは決して良い考えではありませんが、フィールドが不変である場合は害が少なくなります。

参照 JavaBeansの代わりに不変のPOJOを使用すべきではないのはなぜですか?

14
Jonas

Get/setメソッドペアの使用は、悲劇的な歴史的な設計上の欠陥です。プロパティを冗長かつ非効率的に実装する別の言語は考えられません。

9
kevin cline

パブリックフィールドは、基本的には複素数や点のような値型であるクラスには問題ないと思います。クラスは、Cスタイルの構造体のようにプリミティブ型をグループ化し、いくつかの演算子を定義するだけです。

5
Karl Bielefeldt

パブリック定数を定義することは、それでも役に立ちます。例えば。

public static final int DAYS_IN_WEEK = 7;

ただし、可能であれば enum's を優先してください。例えば。

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
}

単純な構造体クラスをシミュレートする にも役立ちます。とにかくすべて公開されている場合、すべてのフィールドにゲッターとセッターを作成する理由はありません。

class Point
{
    public int x, y;
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
5
Steven Jeuris

IDEが普及する前は、すべてのフィールドを公開することは、プロトタイプや概念の証明をすばやく作成するための強力なツールでした。

現在、マウスをクリックするだけでゲッター/セッターのペアを生成できる場合、それらを使用する言い訳はほとんどありません。

2
biziclop

これは主観的ですが、私見では、パブリック/プライベートの概念全体は古く、時代遅れです。

pythonでは、public/privateはありません。すべてが基本的にpublicです。多くの問題は発生していません。

Javaでは、各フィールドに無意味なゲッター/セッターを作成して、それらを「パブリック」とマークするという罪を回避する傾向があります。

2
hasen