軟體開發筆記
純軟體開發筆記(目前不包含 Web,考慮以後都包含進去)
Java
爪哇島、咖啡
實在是太冗贅了
Java
Java 觀念 - final 關鍵字
📓 此篇不是很完整,隨時會有很大的變動
final 在 Java 是一個關鍵字,出現在不同的 Code 上有不同的用途。
出現在 class 上
代表此 class 不能被他類繼承。
刻意繼承會出現 Compile error。
出現在方法上
代表此方法不可以被重寫(Override)
刻意重寫會出現 Compile error。
出現在變數上
代表此變數不可以被重新賦值。刻意重新賦值會出現 Compile error。
但是如果該變數被指到一個物件上,物件的實際內容(狀態)仍然可以被改變,因為 fianl 在變數上只是定義是否可以重新賦值。
其他
- fianl 不可以跟 abstract 關鍵字混用,因為他們的觀念互相衝突
- 使用 Reflection API 仍然有可能對已經設定成 fianl 的變數造成改變(參考)
Java
JDA 抓取 Discord Forum Channel 內的 Thread 清單
Code 範例
public class Main extends ListenerAdapter {
public static final String TOKEN = "<BOT_TOKEN_HERE>";
public static final String SERVER_ID = "<SERVER_ID_HERE>";
public static final String PROJECT_FORUM_ID = "<FORUM_ID_HERE>";
public static void main(String[] args) throws InterruptedException {
JDA jda = JDABuilder.createDefault(Main.TOKEN).build();
jda.addEventListener(new Main());
}
@Override
public void onReady(ReadyEvent event) {
System.out.println("Bot is ready");
JDA jda = event.getJDA();
Guild server = jda.getGuildById(SERVER_ID);
assert server != null;
ForumChannel channel = server.getForumChannelById(PROJECT_FORUM_ID);
assert channel != null;
System.out.printf("Channel name: %s%n", channel.getName());
List<ThreadChannel> threadChannels = channel.getThreadChannels();
for(ThreadChannel thread : threadChannels){
System.out.printf("Thread: %s%n", thread.getName());
}
// 如果要正常關閉 Bot 的話需要以下指令
// jda.shutdown();
}
}
解釋
- 用 JDA 物件取得 Guild 物件 (這邊先當作 Discord Server 的代表),再用 Guild 物件取得 ForumChnnel 物件
- 接下來就好辦了:使用
getThreadChannels()
方法取得裡面充滿 ThreadChannel 的 List - 有了 List 物件,想要幹嘛都很方便,這邊以 for 迴圈做例子
注意
- 範例的 TOKEN、Channel ID 都是寫死的 (Hardcode),正式環境不要這樣寫
- JDA 是可以正常關機的 (JDA.shutdown()),強制關閉 Gradle 會提示回傳錯誤碼
Java
Java 觀念 - Type Casting
Type Casting 跟物件繼承很有關係,只要子類別繼承父類別,那他們就有 Casting 的關係。
直接看以下範例:
class Animal {
void speak(){
System.out.println("Default speak");
}
}
class Bird extends Animal {
@Override
void speak() {
System.out.println("ㄐㄐ");
}
}
class Dog extends Animal {
@Override
void speak() {
System.out.println("吉娃娃");
}
}
public class main {
public static void main(String[] args) {
Animal animal = new Animal();
Bird bird = new Bird();
Dog dog = new Dog();
animal.speak();
bird.speak();
dog.speak();
// Upcasting and Downcasting
Animal animal2;
animal2 = bird; // Upcasting
animal2.speak(); // works normally
Bird bird2;
// bird2 = animal; // Down casing, compile error
// bird2 = (Bird)animal; // Compile pass
// bird2.speak(); // but throw ClassCastException error
Dog dog2;
// dog2 = bird; // Obviously not working for compiling
// dog2 = (Dog)bird; // Cannot casting to another child class, compile error.
}
}
- Bird 可以 casting 成父類別 Animal,且也可以正常運作,這行為叫做 Upcasting。通常 Upcasting 不會有太大的問題。
- 把 animal casting 成 Bird,在邏輯上說不通(你也不確定這個 Animal 到底是不是 Bird 呀),Compiler 也意識到這件事情,就不給你過
- 這種行為叫做 Downcasting,通常 Compiler 檢查都不會讓你過
- 但是可以用 (Bird)animal,其實這就是叫 Compiler 閉嘴,跟 Compiler 表示這動物就是鳥,於是 Compiler 兩手一攤,表示 OK 我不管你
- 可是在這樣的狀況下,使用底下的方法就會跳出 ClassCastException 這個 Runtime error,JVM 跟你說「欸欸你不可以這樣跑啦」
- 如果是 Animal 底下的繼承 class 互轉,很顯然地過不了(狗要怎麼變成鳥,鳥要怎麼變成狗?),而且也沒辦法叫 Compiler 閉嘴(Compiler:我要阻止倫理問題發生呀...)
Spring (包含 Spring Boot)
Java 常用的網頁應用框架
Spring (包含 Spring Boot)
建立新的 Spring 專案
- 連上 https://start.spring.io/
- Project 部份選擇「Gradle - Kotlin」(這會使用 Kotlin DSL)
- Spring Boot 部份選擇後面不帶任何括弧的最新版本
- Project Metadata 照實填寫
- Packaging 選擇「Jar」
- Java 選擇最新版本(或是你電腦上有灌的版本)
- Dependencies 部份點擊「Add Dependencies...」,搜尋「Spring Web」後並把它加入其中
- 最後點擊最下面的「GENERATE」就會產出新專案的壓縮檔