我是PL / SQL中的新手,这个问题看起来可能是幼稚的'所以我提前抱歉,但Google根本没有帮助我......
以下程序有什么区别吗?
public final class Card<S,V> {
final S suit;
final V value;
public Card(S suit, V value) {
this.suit = suit;
this.value = value;
}
@Override
public String toString() {
return suit+" "+value;
}
}
public class Deck<S extends Enum<S>,V extends Enum<V>> {
protected final Set<S> allSuits;
protected final Set<V> allValues;
protected final List<Card<S,V>> allCards;
public Deck(Class<S> suitType, Class<V> valueType) {
Set<S> suits =EnumSet.allOf(suitType);
Set<V> values=EnumSet.allOf(valueType);
List<Card<S,V>> cardList=new ArrayList<>(suits.size()*values.size());
for(S suite: suits){
for(V value: values) {
cardList.add(new Card<>(suite, value));
}
}
allSuits =Collections.unmodifiableSet(suits);
allValues=Collections.unmodifiableSet(values);
allCards =Collections.unmodifiableList(cardList);
}
@Override
public String toString() {
return getClass().getSimpleName()+allCards;
}
}
public class PokerDeck extends Deck<PokerDeck.Suits,PokerDeck.Values> {
enum Suits { SPADES, HEARTS, DIAMONDS, CLUBS }
enum Values { ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN,
EIGHT, NINE, TEN, JACK, QUEEN, KING }
public PokerDeck(){
super(Suits.class, Values.class);
}
}
public class CarteBriscolaDeck
extends Deck<CarteBriscolaDeck.Suits,CarteBriscolaDeck.Values> {
enum Suits { COPPE, DENARE, BASTONI, SPADE }
enum Values { ASSO, DUE, TRE, QUATTRO, CINQUE, SEI, SETTE, FANTE, CAVALLO, RE }
public CarteBriscolaDeck(){
super(Suits.class, Values.class);
}
}
我已经检查了它们,所以当我在没有args的情况下调用它们时输出为Procedure p1(a Number DEFAULT 0) Is
Begin
DBMS_OUTPUT.put_line(a);
End;
Procedure p2(a Number := 0) Is
Begin
DBMS_OUTPUT.put_line(a);
End;
,但我不确定是否有任何副作用。
答案 0 :(得分:2)
如果您关注Oracle的documentation
您可以使用关键字DEFAULT而不是赋值运算符 初始化变量。您也可以使用DEFAULT进行初始化 子程序参数,游标参数和用户定义的字段 记录。
对具有典型值的变量使用DEFAULT。使用 变量的赋值运算符(例如计数器和累加器) 没有典型的价值。
DECLARE
blood_type CHAR DEFAULT 'O'; -- Same as blood_type CHAR := 'O';
hours_worked INTEGER DEFAULT 40; -- Typical value
employee_count INTEGER := 0; -- No typical value
BEGIN
NULL;
END;
/
所以我猜内部是一样的。
答案 1 :(得分:2)
让我们在撰写本文时查看最新Oracle版本(12c R1)的文档。你明确要求子程序参数,所以让我们首先考虑它。
Default Values for IN Subprogram Parameters:
声明正式的IN参数时,可以为其指定默认值。具有默认值的形式参数称为可选参数,因为其对应的实际参数在子程序调用中是可选的。如果省略实际参数,则调用将默认值分配给形参。
文档没有提及default
个关键字,但它仍然有效。示例(在12c R1中):
declare
function f1(a in number) return number is begin return a; end;
function f2(a in number := 2) return number is begin return a; end;
function f3(a in number default 3) return number is begin return a; end;
begin
dbms_output.put_line(f1(1));
dbms_output.put_line(f2);
dbms_output.put_line(f3);
end;
/
按预期打印1,2,3。
然而,由于在授权文档中未提及,我不鼓励在此上下文中使用default
关键字。
其他有趣的背景是Initial Values of Variables and Constants:
要指定初始值,请使用赋值运算符(:=)或关键字DEFAULT,后跟表达式。
这是唯一提及default
个关键字的时间。所有文档示例仅使用分配。
<强>结论强>
技术上default
关键字和分配是相同的,并且在两个上下文中都有效,但在文档中只提升了分配。我认为Oracle在这种情况下有效地弃用了default
关键字,因此我不推荐在新的PL / SQL代码中使用它。 Assigment操作员可以毫不费力地完成同样的工作。