18116


C#にはクラスを値型で宣言する方法があります。Java8で同じことはできませんか。

**詳細**  
クラスは常に参照型になります。  
しかし、例えばC#ではstructによりオブジェクトを参照型ではなく値型として宣言できます。これをもちいるとC++のクラスのようにオブジェクトに割り当てられる領域の生存期間を（ガベージコレクタのことを気にせずに）明確にできます。Java8で同じことはできませんか。


CC BY-SA 3.0
2015-10-18T12:34:51.277
17775
2015-10-31T07:07:18.773
2015-10-31T07:07:18.773
12831
12831
question
java
オブジェクト型を値型で宣言できるか


Java 8現在、[C#の`struct`型](https://msdn.microsoft.com/ja-
jp/library/saxz13w4.aspx)に相当する「値型」は定義できません。

未来のJava言語仕様を検討する活動の一つに [Project
Valhalla](http://openjdk.java.net/projects/valhalla/) というものがあり、そこでは「[Value
Types](http://cr.openjdk.java.net/%7Ejrose/values/values-0.html), [Value
Objects](http://openjdk.java.net/jeps/169)」導入が議論されています。現時点では、それらがいつ導入されるかも分かりませんが、[Java
10/11あたりでの導入を目指している](http://www.publickey1.jp/blog/15/java_10_11osjavaone_2015.html)ようです。

* * *

（これ以降はProject Valhalla資料に基づきます。最終的なJava仕様では変更されるかもしれません）

Javaで導入検討されているValue
Typesでは、全フィールドへの`final`修飾が必須、つまり値型のフィールド値を後から変更することはできません。Value
TypesではfinalかつImmutableな["Value-based
Class"](http://docs.oracle.com/javase/8/docs/api/java/lang/doc-
files/ValueBased.html)での性能改善を目的としており、過度な複雑度を導入しないよう意図的に制限するようです。[State of the
Values](http://cr.openjdk.java.net/%7Ejrose/values/values-0.html)より関連個所を引用します：

> **Details, details**  
>  Can a value class contain a non-final field? No. (Logically possible, with
> a surprising explosion of complexity.)
>
> **Open questions**  
>  _Fieldwise side effects._ Why are value fields always final? Why can’t I
> side-effect just one field in a value? I want all the efficiency of “by
> value” and all the mutability of “by reference”! This is a long
> conversation. There are logically consistent ways to provide such things
> which, on balance, appear to be dismayingly complex. Java will never be C++,
> though there are proposals to improve its interoperation with C++. As noted
> above, values will certainly play a part with such interoperation.


CC BY-SA 3.0
2015-10-27T05:22:24.293
18116
2015-10-27T07:03:33.547
2020-06-17T08:14:45.997
-1
49
17775
answer