Pourquoi n'est-ce pas de Chaîne publique de la fonction de travail?
C'est dire qu'elle doit retourner une chaîne de caractères, mais je ne vois rien de mal à cela? Je pense que numericDayOfWeek devrait être fonctionne bien?
public String getDayOfWeek(){
if(numericDayOfWeek==0){
return "Saturday";
}
if(numericDayOfWeek==1){
return "Sunday";
}
if(numericDayOfWeek==2){
return "Monday";
}
if(numericDayOfWeek==3){
return "Tuesday";
}
if(numericDayOfWeek==4){
return "Wednesday";
}
if(numericDayOfWeek==5){
return "Thursday";
}
if(numericDayOfWeek==6){
return "Friday";
}
}
Voici le code complet
public class DayOfWeek {
int myMonth, myDayOfMonth, myYear, myAdjustment, numericDayOfWeek;
public DayOfWeek(int month, int dayOfMonth, int year){
myMonth = month;
myDayOfMonth = dayOfMonth;
myYear = year;
}
public int getNumericDayOfWeek(){
if(myMonth==1){
myAdjustment = 1;
if(myYear%4==0){
myAdjustment-=1;
}
}
if(myMonth==2){
myAdjustment = 4;
if(myYear%4==0){
myAdjustment-=1;
}
}
if(myMonth==3){
myAdjustment = 4;
}
if(myMonth==4){
myAdjustment = 0;
}
if(myMonth==5){
myAdjustment = 2;
}
if(myMonth==6){
myAdjustment = 5;
}
if(myMonth==7){
myAdjustment = 0;
}
if(myMonth==8){
myAdjustment = 3;
}
if(myMonth==9){
myAdjustment = 6;
}
if(myMonth==10){
myAdjustment = 1;
}
if(myMonth==11){
myAdjustment = 4;
}
if(myMonth==12){
myAdjustment = 6;
}
int fourDivides = myYear / 4;
numericDayOfWeek = myAdjustment + myDayOfMonth + (myYear-1900) + fourDivides;
return numericDayOfWeek;
}
public String getDayOfWeek(){
if(numericDayOfWeek==0){
return "Saturday";
}
if(numericDayOfWeek==1){
return "Sunday";
}
if(numericDayOfWeek==2){
return "Monday";
}
if(numericDayOfWeek==3){
return "Tuesday";
}
if(numericDayOfWeek==4){
return "Wednesday";
}
if(numericDayOfWeek==5){
return "Thursday";
}
if(numericDayOfWeek==6){
return "Friday";
}
}
public int getMonth(){
}
public String getMonthString(){
}
public int getDayOfMonth(){
}
public int getYear(){
}
}
- au lieu de
if..then
vous devez utiliserswitch
, afin de vous éviter de faire 7 comparaison, dans le pire des cas (pour la méthodegetDayOfWeek
), ou à la locationif..then..else
parce qu'ils sont des exclusivités. - Ce sera le retour de la fonction si aucune des si la condition est satisfaite? c'est la question pour vous ici.
- Consultez également
getDisplayName()
dans leCalendar
classe. Pas beaucoup de sens ici de réinventer la roue. docs.oracle.com/javase/7/docs/api/java/util/...
Vous devez vous connecter pour publier un commentaire.
Sotirios est correct, mais une meilleure solution serait d'utiliser une instruction de cas:
Si aucune des conditions de passe, c'est à dire. ils ont tous d'évaluer à
false
, la méthode ne retourne rien. Ajouter une valeur par défaut de retour à la finLe compilateur considère que tous les chemins. Si aucun si la
if
consolidés a été exécuté, il n'aurait rien àreturn
. Dans ce cas, il ne sera pas en mesure de compiler, car la méthode ne garantit pas le contrat spécifié par sa définition, c'est à dire. pour revenir unString
.Suivre les commentaires ou l'autre réponse sur comment, éventuellement, fait de ce effectuer le meilleur ou pour le rendre plus facile à lire (
switch-case
).Cela devrait fonctionner:
else
.numericaDayOfWeek
prend, vous obtiendrezFriday
pour valeur 1231231. Cela fait-il sens?if-then-else
c'est mieux queif-then
dans ce cas, parce qu'ils sont exclusifs des comparaisons.La raison de l'erreur de compilation, le compilateur ne peut pas être certain que votre code renvoie toujours une Chaîne de caractères à partir de votre méthode.
Dans le cas où numericDayOfWeek n'est pas dans la plage de 0 à 6, votre fonction n'est pas de spécifier quelle valeur doit être retourné, et il n'existe aucun moyen pour le compilateur de savoir ou de garantir que numericDayOfWeek sera toujours dans la plage souhaitée.
Malheureusement, le compilateur est limité dans sa capacité à assurer un
return
exposé, même dans les cas simples. Prendre le trivial (et inutile) de la méthode ci-dessous:Ci-dessus entraînera une erreur de compilation, en disant: la méthode doit retourner un type booléen. On pourrait facilement y remédier en changeant la deuxième
if
de l'instruction d'uneelse
clause puisque c'est l'un des rares moyens qui permettent au compilateur de s'assurer que l'un ou l'autre des blocs de code sont garantis d'être exécuté.Les règles sont qu'une méthode avec un type de retour ne doit pas remplir la normalement et doit plutôt complet brusquement (brusquement ici en indiquant par l'intermédiaire d'un
return
déclaration ou une exception) par JLS 8.4.7. Le compilateur attend de voir si les normale de résiliation est possible, basé sur les règles définies dans JLS 14.21 Inaccessible États qu'il définit également les règles normales d'achèvement.Dans le cas de votre exemple précis, je dirais envisage de lancer un
IllegalArgumentException
comme la dernière ligne de votre méthode et le remplacement de votreif
déclaration avec unswitch
déclaration. E. g.Vous pouvez également lancer l'exception dans un
default
de la clause de laswitch
déclaration, mais dans ce cas je dirais que c'est juste une question de préférence personnelle, et je préfère à l'extérieur de laswitch
ici.