热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

@SuppressWarnings({"unchecked",&quot

Non-staticaccesscodetostaticmember.デフォルトレベル:Warningメッセージ:Thestaticfield${クラス名}.${クラス変数名}shouldbeaccessedinastaticway抑止:@SuppressWarnings(static-access)代替手段:コードを直そう。Indirecta

Non-static access code to static member. デフォルトレベル:Warning メッセージ: The static field ${クラス名}.${クラス変数名} should be accessed in a static way 抑止: @SuppressWarnings( static-access ) 代替手段:コードを直そう。 Indirect a

  • Non-static access code to static member.
    • デフォルトレベル:Warning
    • メッセージ: The static field ${クラス名}.${クラス変数名} should be accessed in a static way
    • 抑止:@SuppressWarnings("static-access")
    • 代替手段:コードを直そう。

  • Indirect access to static member.
    • デフォルトレベル:Ignore
    • メッセージ: The static field ${クラス名}.${変数名} should be accessed directly
    • 抑止:@SuppressWarnings("static-access")
    • 代替手段:コードを直そう。

  • Unqualified access to instance field
    • デフォルトレベル:Ignore
    • メッセージ: Unqualified access to the field ${クラス名}.{インスタンス変数名}
    • 抑止:@SuppressWarnings("unqualified-field-access")
    • 代替手段:thisを付ければ普通に消える。

  • Undocumented empty block
    • デフォルトレベル:Ignore
    • メッセージ: Empty block should be documented
    • 抑止:なし
    • 代替手段:コメントを入れてください。

  • Access to a non-accessible member of an enclosing type
    • デフォルトレベル:Ignore
    • メッセージ: Read access to enclosing field ${クラス名}.${変数名} is emulated by a synthetic accessor method
    • 抑止:@SuppressWarnings("synthetic-access")
    • 代替手段:可能であれば、変数にfinal修飾子を付けるだとかアクセス修飾子を考える。

  • Method with a constructor name
    • デフォルトレベル:Warning
    • メッセージ:this method has a constructor name
    • 抑止:なし。
    • 代替手段:素直にメソッド名を変えます。

  • Parameter assignment
    • デフォルトレベル:Ignore
    • メッセージ:The parameter ${パラメータ変数名} should be assigned
    • 抑止:なし
    • 代替手段:パラメータ変数にfinal付ける習慣を持つと、コンパイルエラーにしてくれるよ。

  • Non-externalized strings (missing/unused $NON-NLS$ tag)
    • デフォルトレベル:Ignore
    • メッセージ(missing):Non-externalized string literal; it should be followed by //$NON-NLS-$
    • メッセージ(unused):Unnecessary $NON-NLS$ tag
    • 抑止:@SuppressWarnings("nls")
    • 代替手段(unused):消すよ普通。
    • 代替手段(missing):外部化ウィザードでやる。
    • $NON-NLS$の数字の秘密はこういうことだよ。String[] a = {"",""}; //$NON-NLS-1$ //$NON-NLS-2$

Potential programming problems


  • Serializable class without serialVersionUID
    • デフォルトレベル:Warning
    • メッセージ:The serializable class ${クラス名} does not declare a static final serialVersionUID field of type long
    • 抑止:@SuppressWarnings("serial")
    • 代替手段:生成シリアルバージョンを入れる。

  • Assignment has no effect (e.g. 'x = x')
    • デフォルトレベル:Warning
    • メッセージ:The assignment to variable object has no effect
    • 抑止:なし。
    • 代替手段:コードを直そう。きっとそのコードは不要だ。

  • Possible accidental boolean assignment (e.g. 'if(a = b)')
    • デフォルトレベル:Ignore
    • メッセージ:Possible accidental assignment in place of a comparison. A condition expression should not be reduced to an assignment
    • 抑止:なし
    • 代替手段:コードが合ってれば直す必要はないが、ずっと警告出てしまうから、出ない書き方すれば?

  • 'finally' does not complete normally
    • デフォルトレベル:Warning
    • メッセージ:finally block does not complete normally
    • 抑止:@SuppressWarnings("finally")
    • 代替手段:特になし。致命的なバグの可能性もあるので見逃して良い警告じゃない。

  • Empty statement
    • デフォルトレベル:Ignore
    • メッセージ:Unnecessary semicolon
    • 抑止:なし
    • 代替手段:セミコロンを消す。

  • Using a char array in string concatenation
    • デフォルトレベル:Warning
    • メッセージ:Must explicitly convert the char[] to a String
    • 抑止:なし
    • 代替手段:まあ、StringBuilderとかで連結しましょう。

  • Hidden catch block
    • デフォルトレベル:Warning
    • メッセージ:Unreachable catch block for ${例外クラス名}. Only more specific exceptions are thrown and handled by previous catch block(s).
    • 抑止:@SuppressWarnings("hiding")
    • 代替手段:特に思いつかない。

  • Inexpect type match for vararg arguments
    • デフォルトレベル:Warning
    • メッセージ:The argument of type null should explicitly be cast to ${可変長クラス名}[] for the invocation of the varargs method foo(${可変長クラス名}...) from type ${クラス名}. It could alternatively be cast to ${可変長クラス名} for a varargs invocation
    • 抑止:なし
    • 代替手段:メッセージに書いてる通りキャストする。

  • Boxing and unboxing conversions
    • デフォルトレベル:Ignore
    • メッセージ(boxing):The expression of type ${プリミティブ型} is boxed into ${ラッパー型}
    • メッセージ(unboxing):The expression of type ${ラッパー型} is unboxed into ${プリミティブ型}
    • 抑止:@SuppressWarnings("boxing")
    • 代替手段:明示的に書くこと。

  • Enum type constant not covered on 'switch'
    • デフォルトレベル:Ignore
    • メッセージ:The enum constant ${他の定数名} needs a corresponding case label in this enum switch on ${Enumクラス名}
    • 抑止:@SuppressWarnings("incomplete-switch")
    • 代替手段:なし。必要ないのを全部書くのは馬鹿らしいよね。

  • 'switch' case fall-through
    • デフォルトレベル:Ignore
    • メッセージ:Switch case may be entered by falling through previous case. If intended, add a new comment //$FALL-THROUGH$ on the line above
    • 抑止:@SuppressWarnings("fallthrough")
    • 代替手段:メッセージにある通りか、またはバグならbreakを書くとか。

  • Null pointer access
    • デフォルトレベル:Warning
    • メッセージ:Null pointer access: The variable i can only be null at this location
    • 抑止:@SuppressWarnings("null")
    • 代替手段:たぶんバグ、きっとバグ、だから直そう。

  • Potential null pointer access
    • デフォルトレベル:Warning
    • メッセージ:Potential null pointer access: The variable i may be null at this location
    • 抑止:@SuppressWarnings("null")
    • 代替手段:その地点までにnullである場合は例外にしちゃうかもね。

  • Comparing identical values ('x == x')
    • デフォルトレベル:Warning
    • メッセージ:Comparing identical expressions
    • 抑止:なし
    • 代替手段:同じ物を比較してんじゃないよ!ってことだよ。

  • Missing synchronized modifier on inherited method
    • デフォルトレベル:Ignore
    • メッセージ:The method ${クラス名}.{メソッドシグニチャ} is overriding a synchronized method without being synchronized
    • 抑止:なし
    • 代替手段:synchronizedを付ける。

  • Class overrides 'equals()' but not 'hashCode()'
    • デフォルトレベル:Ignore
    • メッセージ:The type ${クラス名} should also implement hashCode() since it overrides Object.equals()
    • 抑止:なし
    • 代替手段:hashCodeをオーバーライドする。とりあえずフィールドから自動作成するクセを付けよう。

  • Dead Code (e.g. 'if(false)')
    • デフォルトレベル:Warning
    • メッセージ:Dead code
    • 抑止:なし
    • 代替手段:普通に消す。

Name shadowing and conflicts


  • Field Declaration hides another field or variable
    • デフォルトレベル:Ignore
    • メッセージ:The field ${クラス名}.${フィールド名} is hiding a field from type ${クラス名}
    • メッセージ:The field ${クラス名}.${フィールド名} is hiding another local variable defined in an enclosing type scope
    • 抑止:@SuppressWarnings("hiding")
    • 代替手段:スーパークラスおよびサブクラスのフィールドのアクセス修飾子が妥当か考えてみる。

  • Local variable declaration hides another field or variable
    • デフォルトレベル:Ignore
    • メッセージ:The local variable name is hiding a field from type ${クラス名}
    • 抑止:@SuppressWarnings("hiding")
    • 代替手段:どちらかの名前を変える。

  • Local variable declaration hides another field or variable
    • Include constructor or setter method parameters
    • デフォルトレベル:Ignore
    • メッセージ:The parameter name is hiding a field from type ${クラス名}
    • 抑止:@SuppressWarnings("hiding")
    • 代替手段:どちらかの名前を変える。パラメーターに@SuppressWarningsを付けることはお勧めしません。ひどく読みにくくなります。

  • Type parameter hides another type
    • デフォルトレベル:Warning
    • メッセージ:The type parameter ${型パラメータ名} is hiding the type ${クラス名}
    • 抑止:@SuppressWarnings("hiding")
    • 代替手段:クラス名の変更よりは、型パラメータの名前を変更した方がいい。
    • おかしなことに、総称型クラスとそのインナークラス(E)で試したら、この警告は出なかった。変だ。バグ?

  • Method does not override package visible method
    • デフォルトレベル:Warning
    • メッセージ:The method ${クラス名}.${メソッド名}() does not override the inherited method from ${クラス名} since it is private to a different package
    • 抑止:なし
    • 代替手段:なんだかパッケージプライベートにするように促されるんだけど意味ないよ。

  • Interface method conflicts with protected 'Object' method
    • デフォルトレベル:Warning
    • メッセージ:The return type is incompatible with Object.clone(), thus this interface cannot be implemented
    • 抑止:なし
    • 代替手段:なし。実装しようとするとコンパイルエラーが出る。だったら警告じゃなくてエラーにしとけよ。

Deprecated and restricted API


  • Deprecated API
    • Signal use of deprecated API inside deprecated code
    • Signal overriding or implementing deprecated method
    • デフォルトレベル:Warning
    • メッセージ:The method ${メソッド名} from the type ${クラス名} is deprecated
    • 抑止:@SuppressWarnings("deprecation")
    • 代替手段:なし。

  • Forbidden reference (access rule)
    • デフォルトレベル:Error
    • 以下はメッセージ例、汎化して書くのが大変だったのでそのまま書きます。これはsun.nio.cs.ext.SJISをデフォルトコンストラタを使ってnewしています。
    • メッセージ:Access restriction: The constructor SJIS() is not accessible due to restriction on required library C:\Program Files (x86)\Java\jre6\lib\charsets.jar
    • メッセージ:Access restriction: The type SJIS is not accessible due to restriction on required library C:\Program Files (x86)\Java\jre6\lib\charsets.jar
    • 抑止:@SuppressWarnings("restriction")
    • 代替手段:そもそもがエラーですから、JDKを実装をしてる人くらいしか使わないはずです。

アクセスルールとは何か!?

eclipseWikiでは?で飛ばしていたのでちょっと僕の実験結果を書いておくよ。

ビルドパスの構成で、JREシステムライブラリーは必ず入れてると思います。

では、そのライブラリを展開すると、いくつかのJarが表示されるでしょう。

そのJarを展開すると

  1. Source attachment
  2. JavaDoc location
  3. Native library location
  4. Access rules

ってのが出てきます。そうです、ここです!

JREが提供するものは、だいたいjavaとかjavaxで始まる類のものは、

みんなアクセス可能であると書いています。

アクセス可能であるというinclude条件にマッチするもの以外をアクセス不許可にしています。

どのJarにも現在は160のルールが設定されているはずです。

アクセスルールは3種類の分類があります。

  1. Forbidden
  2. Discouraged
  3. Accessible

JREとかのは、AccessibleとForbiddenしか使ってないはずです。

クラスのアクセス修飾子とは関係がないっす。


  • Discouraged reference (access rules)
    • デフォルトレベル:Warning
    • 以下の例は、私の別のJavaプロジェクトをビルドパスに含め、そのプロジェクトにDiscouragedなアクセスルールを設定して行った場合の例を元にしています。他に、importや変数の型にも反応します。
    • メッセージ:Discouraged access: The type ${クラス名} is not accessible due to restriction on required project ${プロジェクト名}
    • 抑止:@SuppressWarnings("restriction")
    • 代替手段:なし。メソッドにSuppressWarnignsを付けても、たいていの場合はimport分にも付けるためクラスにSuppressWarningsを付けることになり、メソッドに付けた方は不要なアノテーションとみなされるでしょう。

Unnecessary Code


  • Local variable is never read
    • デフォルトレベル:Warning
    • メッセージ:The local variable ${ローカル変数名} is never read
    • 抑止:@SuppressWarnings("unused")
    • 代替手段:要らないなら消しておこう。

  • Parameter is never read
    • Ignore in overriding and implementing methods
    • Ignore parameters documented with '@param' tag
    • デフォルトレベル:Ignore
    • メッセージ:The parameter a is never read
    • 抑止:@SuppressWarnings("unused")
    • 代替手段:なし。消すとシグニチャーが変わるので影響がデカイ。

  • Unused Import
    • デフォルトレベル:Warning
    • メッセージ:The import ${クラス名} is never used
    • 抑止:@SuppressWarnings("unused")
    • 代替手段:クラスにunusedが付くよりは、import編成した方が良い。

  • Unused local or private member
    • デフォルトレベル:Warning
    • メッセージ:The type ${ローカルクラス名} is never used locally
    • メッセージ:The type ${privateなインナークラス名} is never used locally
    • メッセージ:The field ${クラス名}.${private変数名} is never read locally
    • 抑止:@SuppressWarnings("unused")
    • 代替手段:使わないなら消そう。

  • Redundant null check
    • デフォルトレベル:Ignore
    • メッセージ:Null comparison always yields false: The variable a cannot be null at this location
    • 抑止:@SuppressWarnings("null")
    • 代替手段:絶対にnullにならないので判定を消した方が良い。

  • Unnecessary 'else' statement
    • デフォルトレベル:Ignore
    • メッセージ:Statement unnecessarily nested within else clause. The corresponding then clause does not complete normally
    • 抑止:なし
    • 代替手段:elseではなくす。けっこう人によって好みが現れるかもしれない。

  • Unnecessary cast or 'instanceof' operation
    • デフォルトレベル:Ignore
    • メッセージ:Unnecessary cast from ${クラス名} to ${クラス名}
    • メッセージ:The expression of type ${クラス名} is already an instance of type ${クラス名}
    • 抑止:@SuppressWarnings("cast")
    • 代替手段:大きな害はないけれど、不要なものは消した方が良い。

  • Unnecessary declaration of thrown exception
    • Ignore in overriding and implementing method
    • Ignore exceptions documented with '@throws' or '@exception' tags
    • Ignore 'Exception' and 'Throwable'
    • デフォルトレベル:Ignore
    • メッセージ:The declared exception ${例外クラス名} is not actually thrown by the method ${メソッド名} from type ${クラス名}
    • 抑止:@SuppressWarnings("unused")
    • 代替手段:使ってないなら消す。インターフェースからの物でも、範囲を狭めるなら許される。

  • Unused 'break' or 'continue' label
    • デフォルトレベル:Warning
    • メッセージ:The label ${ラベル名} is never explicitly referenced
    • 抑止:@SuppressWarnings("unused")
    • 代替手段:使ってないなら消す。そもそもラベル使うほどの特殊なコードを書く人は少ないだろうが…。
    • 使ったこと無い人が多いから付け加えておく。"break ラベル名;"や"continue ラベル名;"って使うんだよ。2つ以上ネストしたループで使うことになるだろう。少なくても日本人がこんなコードは書いてるところを見たことがない。そうだな、SQL文のパーサー、CSVの解析をする時にこのコーディングを使うとより高速になるだろう。

  • Redundant super interface
    • デフォルトレベル:Ignore
    • メッセージ:Redundant superinterface ${インターフェース名} for the type ${サブクラス名}, already defined by ${スーパークラス名}
    • 抑止:@SuppressWarnings("unused")
    • 代替手段:普通はサブクラスにあるのを消す。まあ、意図するところがあるならば、スーパークラスでimplementsしない。

Generic Types


  • Unchecked generic type operation
    • デフォルトレベル:Warning
    • メッセージ:Type safety: The method ${メソッド名} belongs to the raw type ${クラス名}. References to generic type ${総称型クラス名} should be parameterized
    • 抑止:@SuppressWarnings("unchecked")
    • 代替手段:型パラメータが分かる場合はそれを使用する。

  • Usage of a raw type
    • デフォルトレベル:Warning
    • メッセージ:${クラス名} is a raw type. References to generic type ${総称型クラス名} should be parameterized
    • 抑止:@SuppressWarnings("unchecked")
    • 代替手段:出来るだけraw型を使わないようにする。ただし設計時にかなり考慮しないと完璧に回避することは困難。

  • Generic type parameter declared with final type bound
    • デフォルトレベル:Warning
    • メッセージ:The type parameter ${型パラメータ名} should not be bounded by the final type ${クラス名}. Final types cannot be further extended
    • 抑止:なし
    • 代替手段:extendedな書き方をしない。継承出来ないものを上限におくのだから、そのクラスしか許さないと言っているだけです。

Annotations


  • Missing '@Override' annotation
    • デフォルトレベル:Ignore
    • メッセージ:The method ${メソッド名} of type ${サブクラス名} should be tagged with @Override since it actually overrides a superclass method
    • 抑止:なし
    • 代替手段:足らない@Overrideを足す。

  • Missing '@Deprecated' annotation
    • デフォルトレベル:Ignore
    • メッセージ:The deprecated method ${メソッド名} of type ${クラス名} should be annotated with @Deprecated
    • 抑止:@SuppressWarnings("dep-ann")
    • 代替手段:@Deprecatedを付けた方が良いと思う。

  • Annotation is used as super interface
    • デフォルトレベル:Warning
    • メッセージ:The annotation type ${アノテーション名} should not be used as a superinterface for ${インターフェース名}
    • 抑止:なし
    • 代替手段:間違った使い方だろうから直した方がいいね。

  • Unhandled token in '@SuppressWarnings'
    • デフォルレベル:Warning
    • メッセージ:Unsupported @SuppressWarnings("${ハンドル出来ない文字列}")
    • 抑止:なし
    • 代替手段:クイックフィックスで出てくるのはミススペル程度のものです。


  • Unused '@SuppressWarnings' annotations
    • デフォルトレベル:Warning
    • メッセージ:Unnecessary @SuppressWarnings("${ハンドル出来る文字}")
    • 抑止:なし
    • 代替手段:要らないから消す。



コンパイラのError/Warningから紐解けた@SuppressWarningsの一覧

  • @SuppressWarnings("boxing")
  • @SuppressWarnings("cast")
  • @SuppressWarnings("dep-ann")
  • @SuppressWarnings("deprecation")
  • @SuppressWarnings("fallthrough")
  • @SuppressWarnings("finally")
  • @SuppressWarnings("hiding")
  • @SuppressWarnings("incomplete-switch")
  • @SuppressWarnings("nls")
  • @SuppressWarnings("null")
  • @SuppressWarnings("restriction")
  • @SuppressWarnings("serial")
  • @SuppressWarnings("static-access")
  • @SuppressWarnings("synthetic-access")
  • @SuppressWarnings("unchecked")
  • @SuppressWarnings("unqualified-field-access")
  • @SuppressWarnings("unused")

推荐阅读
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 本文介绍了如何使用Power Design(PD)和SQL Server进行数据库反向工程的方法。通过创建数据源、选择要反向工程的数据表,PD可以生成物理模型,进而生成所需的概念模型。该方法适用于SQL Server数据库,对于其他数据库是否适用尚不确定。详细步骤和操作说明可参考本文内容。 ... [详细]
  • 最近学习反射机制的时候Properties.load(读取本地文件流的时候怎么也找不到加载文件后面发现IDEA的默认根目录是在它的Project工程下IDEA的文件目录和Ec ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
author-avatar
MCphp
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有