1 /*
2 * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
88 /**
89 * A date in the Hijrah calendar system.
90 * <p>
91 * This date operates using one of several variants of the
92 * {@linkplain HijrahChronology Hijrah calendar}.
93 * <p>
94 * The Hijrah calendar has a different total of days in a year than
95 * Gregorian calendar, and the length of each month is based on the period
96 * of a complete revolution of the moon around the earth
97 * (as between successive new moons).
98 * Refer to the {@link HijrahChronology} for details of supported variants.
99 * <p>
100 * Each HijrahDate is created bound to a particular HijrahChronology,
101 * The same chronology is propagated to each HijrahDate computed from the date.
102 * To use a different Hijrah variant, its HijrahChronology can be used
103 * to create new HijrahDate instances.
104 * Alternatively, the {@link #withVariant} method can be used to convert
105 * to a new HijrahChronology.
106 * <p>
107 * This is a <a href="{@docRoot}/java.base/java/lang/doc-files/ValueBased.html">value-based</a>
108 * class; programmers should treat instances that are
109 * {@linkplain #equals(Object) equal} as interchangeable and should not
110 * use instances for synchronization, or unpredictable behavior may
111 * occur. For example, in a future release, synchronization may fail.
112 * The {@code equals} method should be used for comparisons.
113 *
114 * @implSpec
115 * This class is immutable and thread-safe.
116 *
117 * @since 1.8
118 */
119 @jdk.internal.ValueBased
120 public final class HijrahDate
121 extends ChronoLocalDateImpl<HijrahDate>
122 implements ChronoLocalDate, Serializable {
123
124 /**
125 * Serialization version.
126 */
127 @java.io.Serial
128 private static final long serialVersionUID = -5207853542612002020L;
129 /**
130 * The Chronology of this HijrahDate.
131 */
132 private final transient HijrahChronology chrono;
133 /**
134 * The proleptic year.
135 */
136 private final transient int prolepticYear;
137 /**
138 * The month-of-year.
139 */
140 private final transient byte monthOfYear;
639 *
640 * @return a suitable hash code based only on the Chronology and the date
641 */
642 @Override // override for performance
643 public int hashCode() {
644 int yearValue = prolepticYear;
645 int monthValue = monthOfYear;
646 int dayValue = dayOfMonth;
647 return getChronology().getId().hashCode() ^ (yearValue & 0xFFFFF800)
648 ^ ((yearValue << 11) + (monthValue << 6) + (dayValue));
649 }
650
651 //-----------------------------------------------------------------------
652 /**
653 * Defend against malicious streams.
654 *
655 * @param s the stream to read
656 * @throws InvalidObjectException always
657 */
658 @java.io.Serial
659 private void readObject(ObjectInputStream s) throws InvalidObjectException {
660 throw new InvalidObjectException("Deserialization via serialization delegate");
661 }
662
663 /**
664 * Writes the object using a
665 * <a href="{@docRoot}/serialized-form.html#java.time.chrono.Ser">dedicated serialized form</a>.
666 * @serialData
667 * <pre>
668 * out.writeByte(6); // identifies a HijrahDate
669 * out.writeObject(chrono); // the HijrahChronology variant
670 * out.writeInt(get(YEAR));
671 * out.writeByte(get(MONTH_OF_YEAR));
672 * out.writeByte(get(DAY_OF_MONTH));
673 * </pre>
674 *
675 * @return the instance of {@code Ser}, not null
676 */
677 @java.io.Serial
678 private Object writeReplace() {
|
1 /*
2 * Copyright (c) 2012, 2026, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
88 /**
89 * A date in the Hijrah calendar system.
90 * <p>
91 * This date operates using one of several variants of the
92 * {@linkplain HijrahChronology Hijrah calendar}.
93 * <p>
94 * The Hijrah calendar has a different total of days in a year than
95 * Gregorian calendar, and the length of each month is based on the period
96 * of a complete revolution of the moon around the earth
97 * (as between successive new moons).
98 * Refer to the {@link HijrahChronology} for details of supported variants.
99 * <p>
100 * Each HijrahDate is created bound to a particular HijrahChronology,
101 * The same chronology is propagated to each HijrahDate computed from the date.
102 * To use a different Hijrah variant, its HijrahChronology can be used
103 * to create new HijrahDate instances.
104 * Alternatively, the {@link #withVariant} method can be used to convert
105 * to a new HijrahChronology.
106 * <p>
107 * This is a <a href="{@docRoot}/java.base/java/lang/doc-files/ValueBased.html">value-based</a>
108 * class; programmers should treat instances that are {@linkplain #equals(Object) equal}
109 * as interchangeable and should not use instances for synchronization or
110 * with {@linkplain java.lang.ref.Reference object references}.
111 *
112 * <div class="preview-block">
113 * <div class="preview-comment">
114 * When preview features are enabled, {@code HijrahDate} is a {@linkplain Class#isValue value class}.
115 * Use of value class instances for synchronization or with
116 * {@linkplain java.lang.ref.Reference object references} result in
117 * {@link IdentityException}.
118 * </div>
119 * </div>
120 *
121 * @implSpec
122 * This class is immutable and thread-safe.
123 *
124 * @since 1.8
125 */
126 @jdk.internal.ValueBased
127 // See doc/value-class-preview.md for an overview of value class generation
128 public final /*value*/ class HijrahDate
129 extends ChronoLocalDateImpl<HijrahDate>
130 implements ChronoLocalDate, Serializable {
131
132 /**
133 * Serialization version.
134 */
135 @java.io.Serial
136 private static final long serialVersionUID = -5207853542612002020L;
137 /**
138 * The Chronology of this HijrahDate.
139 */
140 private final transient HijrahChronology chrono;
141 /**
142 * The proleptic year.
143 */
144 private final transient int prolepticYear;
145 /**
146 * The month-of-year.
147 */
148 private final transient byte monthOfYear;
647 *
648 * @return a suitable hash code based only on the Chronology and the date
649 */
650 @Override // override for performance
651 public int hashCode() {
652 int yearValue = prolepticYear;
653 int monthValue = monthOfYear;
654 int dayValue = dayOfMonth;
655 return getChronology().getId().hashCode() ^ (yearValue & 0xFFFFF800)
656 ^ ((yearValue << 11) + (monthValue << 6) + (dayValue));
657 }
658
659 //-----------------------------------------------------------------------
660 /**
661 * Defend against malicious streams.
662 *
663 * @param s the stream to read
664 * @throws InvalidObjectException always
665 */
666 @java.io.Serial
667 @SuppressWarnings("serial") // this method is not invoked for value classes
668 private void readObject(ObjectInputStream s) throws InvalidObjectException {
669 throw new InvalidObjectException("Deserialization via serialization delegate");
670 }
671
672 /**
673 * Writes the object using a
674 * <a href="{@docRoot}/serialized-form.html#java.time.chrono.Ser">dedicated serialized form</a>.
675 * @serialData
676 * <pre>
677 * out.writeByte(6); // identifies a HijrahDate
678 * out.writeObject(chrono); // the HijrahChronology variant
679 * out.writeInt(get(YEAR));
680 * out.writeByte(get(MONTH_OF_YEAR));
681 * out.writeByte(get(DAY_OF_MONTH));
682 * </pre>
683 *
684 * @return the instance of {@code Ser}, not null
685 */
686 @java.io.Serial
687 private Object writeReplace() {
|